#include"Cstdio"#include"algorithm"#include"CString"using namespacestd;Const intmaxn=8005;structnode{intL,r; intFlag;} A[MAXN*4];voidBuildintRtintLintR) {A[RT].L=l; A[RT].R=R; A[rt].flag=-1; if(l==r) {return ; } intMid= (l+r) >>1; Build (Rt<<1, L,mid); Build (Rt<<1)|1, mid+1, R);}voidPushdown (intRT) {A[rt<<1].flag=a[(rt<<1)|1].flag=A[rt].flag;//A[rt].flag=-1;}voidUpdateintRtintLintRintval) { if(a[rt].l==l&&a[rt].r==r) {A[rt].flag=Val; return ; } if(a[rt].flag!=-1) pushdown (RT); intMid= (A[RT].L+A[RT].R) >>1; if(r<=mid) Update (rt<<1, L,r,val); Else if(mid<l) Update ((rt<<1)|1, L,r,val); Else{update (RT<<1, L,mid,val); Update (RT<<1)|1, mid+1, R,val); } if(a[rt<<1].flag!=a[(rt<<1)|1].flag) a[rt].flag=-1;//-1 for two sub-trees of different colors or no coloring Elsea[rt].flag=a[rt<<1].flag;}intSEG[MAXN];intX[MAXN];voidQueryintRT) { if(a[rt].flag!=-1) { for(inti=a[rt].l;i<=a[rt].r;i++) {Seg[i]=a[rt].flag;//Save the color of each fragment in an array } return ; } if(A[RT].L==A[RT].R)return ; Query (RT<<1); Query (RT<<1)|1);}intMain () {intN; while(SCANF ("%d", &n)! =EOF) { intmaxn=-1; Build (1,1,8000); memset (SEG,-1,sizeof(SEG)); memset (x,0,sizeof(x)); while(n--) { intl,r,v; scanf ("%d%d%d",&l,&r,&v); if(V>MAXN) maxn=v; Update (1, L +1, r,v); } query (1); intpre=-1; for(intI=1; i<=8000; i++) { if(pre!=Seg[i]) {Pre=Seg[i]; X[pre]++; } } for(intI=0; i<=maxn;i++) { if(x[i]!=0) {printf ("%d%d\n", I,x[i]); }} printf ("\ n"); } }
ZOJ1610 (classic line segment tree coloring problem)