题目:http://poj.org/problem?id=2777
线段树。线段覆盖+lazy标记。处理查询的时候要注意。不要查询到最下面的子树,不然会超时
下面是AC代码:
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 100000+10;
#define lson id<<1,l,m
#define rson id<<1|1,m+1,r
struct node{
int l,r;
int color;
}T[maxn<<2];
void build(int id,int l,int r){
T[id].l=l;T[id].r=r; T[id].color=-1;
if(l==r) return ;
int m=(l+r)>>1;
build(lson); build(rson);
}
void update(int id,int l,int r,int color){
if(T[id].l>=l&&T[id].r<=r){
T[id].color=color;
return ;
}
if(T[id].color!=-1){
T[id<<1].color=T[id<<1|1].color=T[id].color;
T[id].color=-1;
}
int m=(T[id].l+T[id].r)>>1;
if(m>=r) update(id<<1,l,r,color);
else if(m<l) update(id<<1|1,l,r,color);
else{
update(lson,color);
update(rson,color);
}
}
int ans[40];
void query(int id,int l,int r){
if(T[id].color!=-1){
ans[ T[id].color ] = 1; return ;
}
int m=(T[id].l+T[id].r)>>1;
if(m>=r) query(id<<1,l,r);
else if(l>m) query(id<<1|1,l,r);
else {
query(id<<1,l,m);
query(id<<1|1,m+1,r);
}
}
int main(){
int l,t,o;
char op[100];
while(scanf("%d%d%d",&l,&t,&o)!=EOF){
build(1,1,l);
update(1,1,l,1);
for(int i=0;i<o;i++){
scanf("%s",op);
int left,right,color;
if(op[0]=='C'){
scanf("%d%d%d",&left,&right,&color);
if(left>right) swap(left,right);
update(1,left,right,color);
}
else{
scanf("%d%d",&left,&right);
if(left>right) swap(left,right);
memset(ans,0,sizeof(ans));
query(1,left,right);
int res=0;
for(int i=1;i<=30;i++) if(ans[i]>0) res++;
printf("%d\n",res++);
}
}
}
return 0;
}