题目大意就是不断更新区间[i,j]的颜色,不断询问区间[i,j]有几种颜色。 在insert函数中一个地方写错了,导致WA了好几次。 还有就是,写着写着忘记判断A是否大于B了。无奈。ORZ。。ORZ。。 #include <iostream> #define MAX 100000 using namespace std; struct node{ int l,r,mid,cov;//cov=-1,表示未被覆盖 }tree[MAX*4]; bool flag[31]; void build(int l,int r,int num) { tree[num].l=l; tree[num].r=r; tree[num].mid=(l+r)>>1; tree[num].cov=1; if(l+1!=r) { int mid=tree[num].mid; build(l,mid,num<<1); build(mid,r,(num<<1)|1); } } void insert(int l,int r,int num,int co) { if(tree[num].l==l&&tree[num].r==r) { tree[num].cov=co; return; } if(tree[num].cov==co) return; if(tree[num].cov!=-1) { tree[num<<1].cov=tree[(num<<1)|1].cov=tree[num].cov; tree[num].cov=-1; } int mid=tree[num].mid; if(r<=mid) insert(l,r,num<<1,co); else if(l>=mid) insert(l,r,(num<<1)|1,co); else { insert(l,mid,num<<1,co); insert(mid,r,(num<<1)|1,co); } } void query(int l,int r,int num) { if(tree[num].cov!=-1) { flag[tree[num].cov]=1; return; } int mid=tree[num].mid; if(r<=mid) query(l,r,num<<1); else if(l>=mid) query(l,r,(num<<1)|1); else { query(l,mid,num<<1); query(mid,r,(num<<1)|1); } } int main() { int l,t,o,i,ll,rr,co,cnt; char ch; while(scanf(" %d%d%d",&l,&t,&o)!=EOF) { build(1,l+1,1); while(o--) { scanf(" %c",&ch); if(ch=='C') { scanf(" %d%d%d",&ll,&rr,&co); if(ll>rr) { cnt=ll; ll=rr; rr=cnt; } insert(ll,rr+1,1,co); } else if(ch=='P') { scanf(" %d%d",&ll,&rr); if(ll>rr) { cnt=ll; ll=rr; rr=cnt; } memset(flag,0,sizeof(flag)); query(ll,rr+1,1); for(i=1,cnt=0;i<=t;++i) { if(flag[i]) cnt++; } printf("%d/n",cnt); } } } return 0; }