线段树成段覆盖:
#include<cstdio> #include<cstring> #define MAXN 10000 int seg[4*MAXN],n,cnt[MAXN],col[MAXN]; void down(int x) { if(seg[x]!=-1) { seg[2*x]=seg[2*x+1]=seg[x]; seg[x]=-1; } } void ud(int le,int re,int a,int b,int i,int x) { if(le==a&&re==b) { seg[i]=x; return; } down(i); int mid=(le+re)>>1; if(mid>=b) ud(le,mid,a,b,2*i,x); else if(mid<a) ud(mid+1,re,a,b,2*i+1,x); else { ud(le,mid,a,mid,2*i,x); ud(mid+1,re,mid+1,b,2*i+1,x); } } void cal(int l,int r,int x) { if(seg[x]!=-1) { for(int i=l;i<=r;i++) col[i]=seg[x]; return; } if(l==r) return; int m=(l+r)>>1; cal(l,m,2*x); cal(m+1,r,2*x+1); } int main() { while(scanf("%d",&n)!=EOF) { memset(seg,-1,sizeof(seg)); memset(col,-1,sizeof(col)); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); a++; ud(1,MAXN,a,b,1,c); } cal(1,MAXN,1); int t=-1; for(int i=1;i<MAXN;i++) { if(col[i]==-1) { t=-1; continue; } if(t!=col[i]) { cnt[col[i]]++; t=col[i]; } } for(int i=0;i<MAXN;i++) if(cnt[i]) printf("%d %d\n",i,cnt[i]); puts(""); } return 0; }