CDQ分治
二维偏序:
求二维偏序 a[ j ].x < a[ i ].x && a[ j ].y < a[ i ].y 可以对x作为第一位度,把x进行排序,然后对y方向用树状数组维护。 #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int maxx = 1e5+6; int sum[maxx]; int ans[maxx]; int n; int m; struct node{ int x,y; bool operator < (const node &b)const{ if (x==b.x){ return y<b.y; } return x<b.x; } }a[maxx]; int lowbit(int x){ return x&(-x); } int query(int x){ int ans=0; for (int i=x;i;i-=lowbit(i)){ ans+=sum[i]; } return ans; } void add(int x,int w){ for (int i=x;i<=m;i+=lowbit(i)){ sum[i]+=w; } return ; } int main(){ while(~scanf("%d",&n)){ memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); m=0; for (int i=1;i<=n;i++){ scanf("%d%d",&a[i].x,&a[i].y); a[i].y++; m=max(m,a[i].y); } sort(a+1,a+1+n); for (int i=1;i<=n;i++){ int s=query(a[i].y); ans[s]++; add(a[i].y,1); } for (int i=0;i<n;i++){ printf("%d\n",ans[i]); } } return 0; }
有不懂欢迎咨询
QQ:1326487164(添加时记得备注)