首页 > 代码库 > Codeforces Round #419 B
Codeforces Round #419 B
B. Karen and Coffee
题意:输入第一行是n k q 分别表示有n个时间段 q个询问,每次询问给出l r 询问l r 时间内 有几个时间点在给出的时间段中出现不小于k次
思路:n个时间段用扫描线处理,询问就是问 l r区间内有几个时间点在扫描线中的厚度不小于k,求2次前缀和就可以了
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int N=2e5+100; int n,k,q,l,r,a,b; int f[N],sum[N]; int main(){ scanf("%d%d%d",&n,&k,&q); for(int i=1; i<=n; ++i){ scanf("%d%d",&l,&r); f[l]++,f[r+1]--; } for(int i=2; i<N; ++i){ f[i]=f[i]+f[i-1]; } if(f[1]>=k) sum[1]++; for(int i=2; i<N; ++i){ if(f[i]>=k){ sum[i]=sum[i-1]+1; } else sum[i]=sum[i-1]; } for(int i=1; i<=q; ++i){ scanf("%d%d",&a,&b); printf("%d\n",sum[b]-sum[a-1]); } return 0; }
Codeforces Round #419 B
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。