题意就是给你一段区间让你涂颜色,或者一段区间让你求颜色个数
对于每一种颜色,将其用二进制状态来记录,合并的时候用 | 运算即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100010;
struct node
{
int l,r;
int color;
int flag;
} seg[N<<2];
void build(int rt,int L,int R)
{
seg[rt].color=1;
seg[rt].l=L;
seg[rt].r=R;
seg[rt].flag=1;
if(seg[rt].l==seg[rt].r)
{
return;
}
int mid=(L+R)/2;
build(rt*2,L,mid);
build(rt*2+1,mid+1,R);
}
void pushup(int rt)
{
seg[rt].color=seg[rt*2].color | seg[2*rt+1].color;
}
void pushdown(int rt)
{
seg[rt*2].color=seg[rt].color;
seg[rt*2].flag=1;
seg[rt*2+1].color=seg[rt].color;
seg[rt*2+1].flag=1;
seg[rt].flag=0;
}
void update(int rt,int L,int R,int color)
{
if(seg[rt].r<L||seg[rt].l>R)
{
return;
}
if(seg[rt].l>=L&&seg[rt].r<=R)
{
seg[rt].color=color;
seg[rt].flag=1;
return;
}
if(seg[rt].color==color)
return;
if(seg[rt].flag)
pushdown(rt);
update(rt*2,L,R,color);
update(rt*2+1,L,R,color);
pushup(rt);
}
int sum;
void query(int rt,int L,int R)
{
if(seg[rt].r<L||seg[rt].l>R)
{
return;
}
if(seg[rt].l>=L&&seg[rt].r<=R)
{
sum|=seg[rt].color;
return;
}
if(seg[rt].flag)
{
sum|=seg[rt].color;
return;
}
query(rt*2,L,R);
query(rt*2+1,L,R);
}
int solve()
{
int ans=0;
while(sum)
{
if(sum&1)
ans++;
sum>>=1;
}
return ans;
}
int main()
{
int L,T,O,a,b,c;
char op[4];
while(~scanf("%d%d%d",&L,&T,&O))
{
build(1,1,L);
while(O--)
{
scanf("%s",op);
if(op[0]=='C')
{
scanf("%d%d%d",&a,&b,&c);
if(a>b)swap(a,b);
update(1,a,b,1<<(c-1));
}
else
{
scanf("%d%d",&a,&b);
if(a>b)swap(a,b);
sum=0;
query(1,a,b);
printf("%d
",solve());
}
}
}
return 0;
}