解析:
区间染色,然后统计相同颜色不同区间的个数
对于区间染色的统一都是将颜色染到叶子节点,叶子节点以上的节点全部恢复无色。
最后询问的时候也就是统计叶子节点的染色情况。
对于本题因为是不同区间的个数,所以我们记录一个前驱颜色。
假设当前区间颜色==前驱颜色 那么区间个数不变
假设当前区间颜色!=前驱颜色 那么区间个数+1
#include<bits/stdc++.h>
using namespace std;
const int N=10000;
struct node
{
int l,r,lazy;
}tr[N<<4];
int l,r,x,y,val,n;
int pre;
int num[N<<4];
void build(int u,int l,int r)
{
tr[u]={l,r,-1};
if(l==r) return ;
int mid=l+r>>1;
build(u<<1,l,mid);build(u<<1|1,mid+1,r);
}
void push_down(int u)
{
if(tr[u].lazy!=-1){
tr[u<<1].lazy=tr[u<<1|1].lazy=tr[u].lazy;
tr[u].lazy=-1;
}
}
void update(int u,int l,int r,int val)
{
if(l<=tr[u].l&&tr[u].r<=r)
{
tr[u].lazy=val;
return ;
}
push_down(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) update(u<<1,l,r,val);
if(r>mid) update(u<<1|1,l,r,val);
}
void query(int u,int l,int r)
{
if(l==r){
//cout<<tr[u].lazy<<endl;
if(tr[u].lazy!=-1&&tr[u].lazy!=pre) num[tr[u].lazy]++;
pre=tr[u].lazy;
return ;
}
push_down(u);
int mid=l+r>>1;
query(u<<1,l,mid);query(u<<1|1,mid+1,r);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(tr,0,sizeof tr);
memset(num,0,sizeof num);
build(1,1,8000);
pre=-1;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&val);
x+=1;
update(1,x,y,val);
}
query(1,1,8000);
for(int i=0;i<=8000;i++ ){
if(num[i])
printf("%d %d\n",i,num[i]);
}
printf("\n");
}
}