| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 38921 | Accepted: 11696 |
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
Source
#include<stdio.h>
#include<string.h>
#define M 100005
struct tree{
int l,r,color,add;
}tree[M<<2];
void pushup(int root)
{
if(tree[root].l==tree[root].r)return;
tree[root].color=tree[root<<1].color|tree[root<<1|1].color; //子节点的颜色种类更新到父节点。
return;
}
void pushdown(int root)
{
if(tree[root].l==tree[root].r)return ;
if(tree[root].add==0)return;
tree[root<<1].add=tree[root<<1|1].add=tree[root].add;
tree[root<<1].color=tree[root].color;
tree[root<<1|1].color=tree[root].color;
tree[root].add=0;
return;
}
void build(int l,int r,int root){
tree[root].l=l;
tree[root].r=r;
tree[root].color=1;
tree[root].add=0;
if(l==r)return ;
int mid=l+r>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
}
void update(int l,int r,int z,int root)
{
if(tree[root].l==l&&tree[root].r==r){
tree[root].color=1<<(z-1);
tree[root].add=z;
return;
}
pushdown(root);
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)update(l,r,z,root<<1);
else if(l>mid)update(l,r,z,root<<1|1);
else {
update(l,mid,z,root<<1);
update(mid+1,r,z,root<<1|1);
}
pushup(root);
}
int query(int l,int r,int root)
{
if(tree[root].l==l&&tree[root].r==r)
{
return tree[root].color;
}
pushdown(root);
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)return query(l,r,root<<1);
else if(l>mid)return query(l,r,root<<1|1);
else {
return query(l,mid,root<<1)|query(mid+1,r,root<<1|1); //颜色合并巧妙使用位运算
}
}
int cal(int x)
{
int ans=0;
while(x)
{
ans+=x%2;
x=x/2;
}
return ans;
}
int main()
{
int L,T,O,i,j,k,a,b,c;
char s[20];
while(scanf("%d%d%d",&L,&T,&O)!=EOF)
{
build(1,L,1);
while(O--)
{
scanf("%s%d%d",s,&a,&b);
if(a>b){
int t=a;
a=b;
b=t;
}
if(s[0]=='C'){
scanf("%d",&c);
update(a,b,c,1);
}
if(s[0]=='P'){
int ans=query(a,b,1);
ans=cal(ans);
printf("%d\n",ans);
}
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 2777 Count Color(线段树、状态压缩、位运算)
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47082435