| 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