要长8000仪表板。间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现
覆盖段
数据对比水 水可太暴力
段树:
#include "stdio.h" #include "string.h" struct node { int l,r,c; }data[40010]; int color[8011]; void build(int l,int r,int k) { int mid; data[k].l=l; data[k].r=r; data[k].c=-1; if (l==r) return ; mid=(l+r)/2; build(l,mid,k*2); build(mid+1,r,k*2+1); } void updata(int l,int r,int k,int op) { int mid; if (data[k].c==op) return ; if (data[k].l==l && data[k].r==r) { data[k].c=op; return ; } if (data[k].c!=-1) { data[k*2].c=data[k*2+1].c=data[k].c; data[k].c=-1; } mid=(data[k].l+data[k].r)/2; if (r<=mid) updata(l,r,k*2,op); else if (l>mid) updata(l,r,k*2+1,op); else { updata(l,mid,k*2,op); updata(mid+1,r,k*2+1,op); } if (data[k*2].c==data[k*2+1].c) data[k].c=data[k*2].c; else data[k].c=-1; } void query(int k) { if (data[k].l==data[k].r) { color[data[k].l]=data[k].c; return ; } if (data[k].c!=-1) data[k*2].c=data[k*2+1].c=data[k].c; query(k*2); query(k*2+1); } int main() { int n,l,r,c,m,now,i; int sum[8011]; m=8010; while (scanf("%d",&n)!=EOF) { build(0,m,1); while (n--) { scanf("%d%d%d",&l,&r,&c); r--; updata(l,r,1,c); } memset(color,-1,sizeof(color)); query(1); memset(sum,0,sizeof(sum)); now=color[0]; sum[now]++; for (i=1;i<=m;i++) if (color[i]!=now) { now=color[i]; sum[now]++; } for (i=0;i<=m;i++) if (sum[i]!=0) printf("%d %d\n",i,sum[i]); printf("\n"); } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
时间: 2024-10-05 02:38:54