【bzoj 3262】陌上花开(CDQ分治)
2017-12-05 20:08
330 查看
传送门biu~
三维偏序。CDQ分治裸题。
三维偏序。CDQ分治裸题。
#include<bits/stdc++.h> #define lowbit(x) (x&(-x)) using namespace std; int n,k,tp; int ans[100005]; struct data{ int x,y,z,num,ans; data(){num=1;ans=0;} bool operator <(const data &r)const{ if(x==r.x){ if(y==r.y) return z<r.z; else return y<r.y; } else return x<r.x; } }a[100005],tmp[100005]; int tree[200005],time_clock[200005],now; void add(int x,int num){ for(int i=x;i<=k;i+=lowbit(i)){ if(time_clock[i]!=now) tree[i]=0; time_clock[i]=now; tree[i]+=num; } } int search(int x){ int re=0; for(int i=x;i;i-=lowbit(i)){ if(time_clock[i]!=now) tree[i]=0; time_clock[i]=now; re+=tree[i]; } return re; } void CDQ(int l,int r){ if(l==r) return; int mid=l+r>>1; CDQ(l,mid); CDQ(mid+1,r); ++now; int j=l; for(int i=mid+1;i<=r;++i){ while(a[j].y<=a[i].y && j<=mid){ add(a[j].z,a[j].num); ++j; } a[i].ans+=search(a[i].z); } int L1=l,L2=mid+1; for(int i=l;i<=r;++i){ if(a[L1].y<a[L2].y && L1<=mid || L2>r) tmp[i]=a[L1++]; else tmp[i]=a[L2++]; } memcpy(a+l,tmp+l,sizeof(a[0])*(r-l+1)); } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;++i) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); sort(a+1,a+n+1); for(int i=1;i<=n;++i){ if(i==1 || a[i].x!=a[i-1].x || a[i].y!=a[i-1].y || a[i].z!=a[i-1].z) a[++tp]=a[i]; else ++a[tp].num; } CDQ(1,tp); for(int i=1;i<=tp;++i) ans[a[i].ans+a[i].num-1]+=a[i].num; for(int i=0;i<n;++i) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- BZOJ - 3262 陌上花开 CDQ分治 三维偏序
- 【BZOJ3262】陌上花开 cdq分治
- CDQ分治--模板 BZOJ 3262--陌上花开【三维偏序】
- BZOJ 3262 陌上花开、HDU 5618 Jam's problem again(三维偏序、cdq分治 + BIT)
- [BZOJ3262]陌上花开(cdq分治+讲解+小结)
- bzoj 3262: 陌上花开(cdq分治)
- BZOJ 3262: 陌上花开 CDQ分治
- BZOJ 3262 陌上花开 树套树 (CDQ分治)
- 【CDQ分治】 BZOJ3262 陌上花开
- [CDQ分治] [树状数组] [BZOJ3262] 陌上花开
- bzoj 3262: 陌上花开 【cdq分治】
- cdq分治入门--BZOJ3262: 陌上花开
- bzoj 3262: 陌上花开 (cdq分治)
- BZOJ 3262 陌上花开 CDQ分治
- 【BZOJ 3262】 陌上花开 CDQ分治 模板题
- bzoj 3262: 陌上花开 -- CDQ分治
- 【BZOJ 3262】 3262: 陌上花开 (CDQ分治)
- 【BZOJ3262】陌上花开(CDQ分治)
- bzoj 3262 陌上花开 【CDQ分治】
- Bzoj 3262: 陌上花开(CDQ分治)