codeforces 816B
2017-08-19 22:19
399 查看
今天开始水codeforces上的题目了。
题目大意:
给定三个数n,k,q
然后给出n个区间。接下来有q个询问,每次询问一个区间里有多少元素被这n个区间覆盖了超过k次。
做法:
一遍做就A了,写的方法有点傻逼,直接套了洛谷树状数组模板2,区间加,然后单点询问。
然后构造前缀和,sum[i]表示1—i中有几个满足条件的。
后面写完发现其实不用树状数组可以值O(n)用差分做。
代码如下:
题目大意:
给定三个数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; }
相关文章推荐
- Codeforces 816B (前缀和算法)
- 【codeforces 816B】Karen and Coffee
- codeforces 816B
- CodeForces - 816B(区间计数)
- Codeforces 816B-Karen and Coffee
- [刷题]Codeforces 816B - Karen and Coffee
- CodeForces 137A
- Codeforces 549F Yura and Developers
- Codeforces 632F Magic Matrix 题解
- 第八周codeforces 853A
- codeforces 691C C. Exponential notation(科学计数法)
- Codeforces 742A-Arpa’s hard exam and Mehrdad’s naive cheat(快速幂)
- Codeforces 675E Trains and Statistic - 线段树 - 动态规划
- codeforces 330A 330B 329A 分别是7月20DIV2的前三题
- Codeforces 551C GukiZ hates Boxes(二分)
- codeforces 812C——Sagheer and Nubian Market(二分)
- Codeforces 876E National Property
- CodeForces 631C
- codeforces 735 A. Ostap and Grasshopper (简单题)
- Codeforces 626C Block Towers