zoj 1610 Count the Colors[セグメントツリー]
2099 ワード
#include<cstring>// , ,
#include<cstdio>
using namespace std;
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
struct node{int l,r,col;};
const int maxn=8008;
node no[maxn<<2];
int col[maxn<<2];// .
int res[maxn<<2];// .
void init(){ // ...
memset(no,0,sizeof(no));
memset(col,-1,sizeof(col));
}
void pushdown(int rt){ // .
if(no[rt].col>=0){
no[rt<<1].col=no[rt<<1|1].col=no[rt].col;
no[rt].col=-1; //
}
}
void build(int l,int r,int rt){ //
no[rt].l=l;
no[rt].r=r;
no[rt].col=-1;
if(l==r-1) return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int p,int l,int r,int rt){ // .
if(no[rt].l>=l&&r>=no[rt].r) {
// x1,x2 .
no[rt].col=p;
return ;
}
if(no[rt].col==p) return;//
pushdown(rt); //
int m=(no[rt].l+no[rt].r)>>1;
if(l>=m)
update(p,l,r,rt<<1|1);
else if(r<=m)
update(p,l,r,rt<<1);
else {
update(p,lson);
update(p,rson);
}
}
void query(int l,int r,int rt){ // , col .
if(no[rt].col>=0){
for(int i=l;i<r;i++)
col[i]=no[rt].col;
return ;
}
if(no[rt].l==no[rt].r-1) return ;
int m=(no[rt].l+no[rt].r)>>1;
if(l>=m) query(l,r,rt<<1|1);
else if(r<=m) query(l,r,rt<<1);
else {
query(lson);
query(rson);
}
}
int main(){
int n,x1,x2,c;
while(~scanf("%d",&n)){
init();
build(0,maxn,1);
while(n--){
scanf("%d%d%d",&x1,&x2,&c);
update(c,x1,x2,1);
}
query(0,maxn,1);//
memset(res,0,sizeof(res));
for(int i=0;i<maxn;i++){
if(col[i+1]!=col[i]&&col[i]!=-1){
res[col[i]]++;
}
}
for(int i=0;i<maxn;i++) {
if(res[i]) printf("%d %d
",i,res[i]);
}
printf("
");
}
return 0;
}