题目大意:
在一段长度为n的黑板上按区间涂色,询问某段区间内不同颜色的数量
这里颜色涂改我们很难区分,但因为这里至多只有30种颜色,所以我们可以利用2进制数来代表颜色的个数
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define N 100005 7 int sum; 8 struct node{ 9 int color; 10 bool cover; 11 int x,y; 12 }node[N<<2]; 13 void push_up(int o) 14 { 15 node[o].color=node[o<<1].color|node[o<<1|1].color; 16 if(node[o<<1].cover&&node[o<<1|1].cover&&node[o<<1].color==node[o<<1|1].color) 17 node[o].cover=true,node[o].color=node[o<<1].color; 18 } 19 void push_down(int o) 20 { 21 int ls=o<<1,rs=o<<1|1; 22 if(node[o].cover){ 23 node[ls].cover=node[rs].cover=true; 24 node[ls].color=node[o].color; 25 node[rs].color=node[o].color; 26 node[o].cover=false; 27 } 28 } 29 void build(int o,int x,int y) 30 { 31 int mid=(x+y)/2,ls=o<<1,rs=o<<1|1; 32 node[o].cover=true; 33 node[o].color=1; 34 node[o].x=x,node[o].y=y; 35 if(x==y) return; 36 build(ls,x,mid); 37 build(rs,mid+1,y); 38 } 39 void update(int o,int s,int t,int v) 40 { 41 int mid=(node[o].x+node[o].y)/2,ls=o<<1,rs=o<<1|1; 42 if(node[o].x>=s&&node[o].y<=t){ 43 node[o].cover=true; 44 node[o].color=v; 45 return; 46 } 47 push_down(o); 48 if(mid>=s) update(ls,s,t,v); 49 if(mid<t) update(rs,s,t,v); 50 push_up(o); 51 } 52 void query(int o,int s,int t) 53 { 54 int mid=(node[o].x+node[o].y)/2,ls=o<<1,rs=o<<1|1; 55 if(node[o].x>=s&&node[o].y<=t){ 56 sum|=node[o].color; 57 return; 58 } 59 push_down(o); 60 if(mid>=s) query(ls,s,t); 61 if(mid<t) query(rs,s,t); 62 } 63 int countbit(int x) 64 { 65 int k=0; 66 while(x){ 67 if(x&1) k++; 68 x>>=1; 69 } 70 return k; 71 } 72 int main() 73 { 74 int n,t,Q,a,b,c; 75 char str[5]; 76 while(~scanf("%d%d%d",&n,&t,&Q)){ 77 build(1,1,n); 78 while(Q--){ 79 scanf("%s%d%d",str,&a,&b); 80 if(a>b) swap(a,b); 81 if(str[0]=='C'){ 82 scanf("%d",&c); 83 update(1,a,b,1<<(c-1)); 84 //cout<<"haha"<<endl; 85 } 86 else{ 87 sum=0; 88 query(1,a,b); 89 printf("%d\n",countbit(sum)); 90 } 91 } 92 } 93 return 0; 94 }
我还在坚持,我还未达到我所想,梦~~一直在