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