这题其实之前写过,应该算是线段树中比较简单的,不过自己还是被坑了很长时间,就是因为一个小小的错误,怎么找都找不到,哎,急哭了。
这题在找颜色种类的时候,因为最多只有30种颜色,所以可以用一个整型变量来存储,一个位代表一种颜色。这里就要考虑对位的处理了,具体见代码。
#include<cstdio>
#include<cstring>
const int N=100005;
int L,T,O;
struct board
{
int left,right,color;
bool ischange;
}node[N<<2];
void set_tree(int id,int l,int r)
{
node[id].left=l,node[id].right=r,node[id].color=1,node[id].ischange=false;
if(l==r)
return;
int lson=id<<1,rson=lson+1,mid=(l+r)/2;
set_tree(lson,l,mid);
set_tree(rson,mid+1,r);
}
void update(int id,int l,int r,int c)
{
if(node[id].left==l&&node[id].right==r)
{
node[id].color=1<<(c-1);
node[id].ischange=true;
return;
}
int lson=id<<1,rson=lson+1,mid=(node[id].left+node[id].right)/2;
if(node[id].ischange)
{
node[lson].ischange=true,node[rson].ischange=true;
node[lson].color=node[id].color,node[rson].color=node[id].color;
node[id].ischange=false;
}
if(r<=mid)
update(lson,l,r,c);
else if(l>mid)
update(rson,l,r,c);
else
{
update(lson,l,mid,c);
update(rson,mid+1,r,c);
}
node[id].color=node[lson].color|node[rson].color;
}
void query(int id,int l,int r,int &ans)
{
if(node[id].ischange||(node[id].left==l&&node[id].right==r))
{
ans|=node[id].color;//就是这里被坑了,我没有加或,而是直接赋值了,当时估计脑袋秀逗了。
return;
}
int lson=id<<1,rson=lson+1,mid=(node[id].left+node[id].right)/2;
if(r<=mid)
query(lson,l,r,ans);
else if(l>mid)
query(rson,l,r,ans);
else
{
query(lson,l,mid,ans);
query(rson,mid+1,r,ans);
}
}
int main()
{
int a,b,c;
char s[3];
while(scanf("%d%d%d",&L,&T,&O)!=EOF)
{
set_tree(1,1,L);
for(int i=1;i<=O;i++)
{
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d",&a,&b,&c);
if(a>b)//这里要比较a,b的大小
update(1,b,a,c);
else
update(1,a,b,c);
}
else
{
scanf("%d%d",&a,&b);
int ans=0,cnt=0;
if(a>b)
query(1,b,a,ans);
else
query(1,a,b,ans);
for(int i=0;i<T;i++)
{
int t=ans&1;
if(t==1)
cnt++;
ans=ans>>1;
}
printf("%d\n",cnt);
}
}
}
return 0;
}