codeforces 816B

来源:互联网 发布:js变量为undefined 编辑:程序博客网 时间:2024/06/06 12:43

今天开始水codeforces上的题目了。

题目大意:

给定三个数n,k,q

然后给出n个区间。接下来有q个询问,每次询问一个区间里有多少元素被这n个区间覆盖了超过k次。

做法:

一遍做就A了,写的方法有点傻逼,直接套了洛谷树状数组模板2,区间加,然后单点询问。

然后构造前缀和,sum[i]表示1—i中有几个满足条件的。

后面写完发现其实不用树状数组可以值O(n)用差分做。

代码如下:

#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<cstdio>#include<string>using namespace std;int n,Q,k,x,y;int c[200005],sum[200005];int lowbit(int x){return x&-x;}int getsum(int x){int ans=0;for (int i=x;i>0;i=i-lowbit(i)) ans=ans+c[i];return ans;}void add(int x,int y){for (int i=x;i<=200005;i=i+lowbit(i)) c[i]=c[i]+y;return;}int main(){scanf("%d%d%d",&n,&k,&Q);memset(c,0,sizeof(c));for (int i=1;i<=n;i++){scanf("%d%d",&x,&y);add(x,1);add(y+1,-1);}memset(sum,0,sizeof(sum));for (int i=1;i<=200005;i++){if (getsum(i)>=k) sum[i]=sum[i-1]+1;else sum[i]=sum[i-1];}while (Q--){scanf("%d%d",&x,&y);printf("%d\n",sum[y]-sum[x-1]);}return 0;}

原创粉丝点击