首页 > 代码库 > POJ2777
POJ2777
题目大意:
在一段长度为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 }
POJ2777
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。