#include"cstdio" #include"algorithm" #include"cstring" using namespace std; const int MAXN=8005; struct node{ int l,r; int flag; }a[MAXN*4]; void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; a[rt].flag=-1; if(l==r) { return ; } int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); } void pushDown(int rt) { a[rt<<1].flag=a[(rt<<1)|1].flag=a[rt].flag; // a[rt].flag=-1; } void update(int rt,int l,int r,int val) { if(a[rt].l==l&&a[rt].r==r) { a[rt].flag=val; return ; } if(a[rt].flag!=-1) pushDown(rt); int mid=(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代表两个子树的颜色不等或者没涂色 else a[rt].flag=a[rt<<1].flag; } int seg[MAXN]; int x[MAXN]; void query(int rt) { if(a[rt].flag!=-1) { for(int i=a[rt].l;i<=a[rt].r;i++) { seg[i]=a[rt].flag;//将每个片段的颜色用数组保存下来 } return ; } if(a[rt].l==a[rt].r) return ; query(rt<<1); query((rt<<1)|1); } int main() { int n; while(scanf("%d",&n)!=EOF) { int maxn=-1; build(1,1,8000); memset(seg,-1,sizeof(seg)); memset(x,0,sizeof(x)); while(n--) { int l,r,v; scanf("%d%d%d",&l,&r,&v); if(v>maxn) maxn=v; update(1,l+1,r,v); } query(1); int pre=-1; for(int i=1;i<=8000;i++) { if(pre!=seg[i]) { pre=seg[i]; x[pre]++; } } for(int i=0;i<=maxn;i++) { if(x[i]!=0) { printf("%d %d\n",i,x[i]); } } printf("\n"); } }
时间: 2024-10-16 13:37:35