题意就是给你一段区间让你涂颜色,或者一段区间让你求颜色个数
对于每一种颜色,将其用二进制状态来记录,合并的时候用 | 运算即可
#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; }