本文共 1974 字,大约阅读时间需要 6 分钟。
0
数据范围不大情况下用树状数组快一点,查询log(n)。
代码:
CDQ:先按照x排序,分治,递归处理左右区间,然后对y进行排序,记录左边区间内比y小的数的个数,边找边统计答案。
#include树状数组:树状数组里面处理的是区间内出现次数总和。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 >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;}
#includeusing 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
转载地址:http://bincf.baihongyu.com/