PowerOj 2392(树状数组 or CDQ分治)
来源:互联网 发布:如何提高淘宝宝贝排名 编辑:程序博客网 时间:2024/06/14 16:07
大家都知道,如果晚上睡不着觉的话,数星星是一种很好的可以帮助入眠的方式。
那现在我们就来数星星吧。
但是对于大家来说,单纯的数星星肯定是太简单了,所以,我们改变一下数星星的方式。
首先,所有的星星都是位于二维坐标平面上的。
其次,我们约定:每一个星星有一个 value 值,这个 value 值等于 x 值不超过其 x 值并且 y 值不超过其 y 值(也即是在坐标平面上位于其左下方(包含边界))的星星的个数。
比如,在上面这个图片中,5号星星的 value ==3(因为1,2,4号星星位于5号星星的左下方)。
2号和4号星星的 value==1。
1号星星的 value==0。
3号星星的 value==2。
所以,在这幅图中,只有一颗星星的 value==0,两颗星星的 value==1,一颗星星的 value==2,一颗星星的 value==3。
现在的任务是:输出每一个 value 所对应的星星的数量。。
Input
多组数据
第一行输入一个数 N(表示所有的星星的数量) (1 <= N <= 10000)
接下来的 N 行,每行一对x,y,表示一个星星的坐标 (1<= X,Y <= 10000 )
星星的坐标不重复。
Output
每组数据输出 N 行
第一行输出value==0 的星星的数量
第二行输出value==1 的星星的数量
..........
第N行输出value==N-1 的星星的数量
Sample Input
5
1 1
5 1
7 1
3 3
5 5
Sample Output
1
2
1
1
0
数据范围不大情况下用树状数组快一点,查询log(n)。
代码:
CDQ:先按照x排序,分治,递归处理左右区间,然后对y进行排序,记录左边区间内比y小的数的个数,边找边统计答案。
#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;int ans[maxn],cnt[maxn];struct node{ int x; int y; int id; node(){} node(int x,int y,int id):x(x),y(y),id(id){}}a[maxn];bool cmp(node m,node n){ if(m.x==n.x) return m.y<n.y; return m.x<n.x;}bool cmp1(node m,node n){ return m.y<n.y;}void CDQ(int l,int r){ if(l==r) return; int mid=(l+r)>>1; CDQ(l,mid); CDQ(mid+1,r); sort(l+a,a+mid+1,cmp1); sort(a+mid+1,a+r+1,cmp1); int left=l; for(int right =mid+1;right<=r;right++) { while(left<=mid&&a[left].y<=a[right].y) left++; cnt[a[right].id]+=left-l; }}int main(){ int n; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(cnt,0,sizeof(cnt)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i].id=i; } sort(a+1,a+1+n,cmp); CDQ(1,n); for(int i=1;i<=n;i++) { ans[cnt[i]]++; } for(int i=0;i<=n-1;i++) { printf("%d\n",ans[i]); } } return 0;}树状数组:树状数组里面处理的是区间内出现次数总和。
#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;int ans[maxn],num[maxn];struct node{ int x; int y;}a[maxn];bool cmp(node a,node b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x;}void init(){ memset(ans,0,sizeof(ans)); memset(num,0,sizeof(num));}int lowbit(int x){ return x&-x;}int getsum(int x){ int ans=0; while(x) { ans+=num[x]; x-=lowbit(x); } return ans;}void add(int x){ while(x<maxn) { num[x]++; x+=lowbit(x); }}int main(){ int n; while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].x,&a[i].y); } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { ans[getsum(a[i].y)]++; add(a[i].y); } for(int i=0;i<=n-1;i++) { printf("%d\n",ans[i]); } } return 0;}
阅读全文
0 0
- PowerOj 2392(树状数组 or CDQ分治)
- 数据(CDQ分治+树状数组)
- BZOJ1176【CDQ分治】【树状数组】
- cdq分治(以cdq分治代替树状数组为例)
- 【BZOJ 3262】陌上花开(CDQ分治+树状数组)
- 【bzoj 1176】[Balkan2007] Mokia(cdq分治+树状数组)
- [BZOJ2738]矩阵乘法(梁盾)CDQ分治+二维树状数组
- bzoj 2683: 简单题 (CDQ分治+树状数组)
- bzoj2683 简单题 (cdq分治 + 树状数组)
- suoj20 垃圾显示屏(cdq分治+树状数组)
- NEU 1704 三维偏序(CDQ分治+树状数组)
- [BZOJ1176][Balkan2007]Mokia && CDQ分治+树状数组
- COGS 577 蝗灾 cdq分治+树状数组
- HDU 5126 stars cdq分治+树状数组
- hdu 5126 stars ( CDQ分治 + 树状数组)
- BZOJ_P1176 [Balkan2007]Mokia(CDQ分治+树状数组)
- BZOJ_P3262 陌上花开(CDQ分治+树状数组)
- 【bzoj2989】【数列】【cdq分治+树状数组】
- JavaScript Canvas 绘图
- junit测试、内省、BeanUtils
- 数据中心的女性如何工作的?
- Spring Data JPA调用存储过程实例
- C++11 新的计时方法——std::chrono 大法好
- PowerOj 2392(树状数组 or CDQ分治)
- 第三篇:JAVA网络编程之应用程序协议中消息的成帧与解析(含代码)
- spark笔记
- 数组a[],a,&a之间的区别
- yum报错: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- jquery checkbox全选/反选
- J
- The k-th Largest Group POJ
- c++中的 extern "C"