标签:des style blog color 使用 os io strong
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35248 | Accepted: 10622 |
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
题解及代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <set> #include <map> #include <queue> #include <string> #define maxn 100100 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ALL %I64d using namespace std; typedef __int64 ll; ll P_2[34]; //我们使用2^p代表第p中颜色 void init() { P_2[0]=1; for(int i=1; i<=33; i++) { P_2[i]=2*P_2[i-1]; } } struct segment { int l,r; ll value; ll nv; } son[maxn<<2]; void PushUp(int rt) { //使用或操作,代表两端区间中颜色数合并 son[rt].value=son[rt<<1].value|son[rt<<1|1].value; } void Build(int l,int r,int rt) { son[rt].l=l; son[rt].r=r; son[rt].nv=0; if(l==r) { son[rt].value=P_2[1]; return; } int m=(l+r)/2; Build(lson); Build(rson); PushUp(rt); } void Update_n(ll w,int l,int r,int rt) { if(son[rt].l==l&&son[rt].r==r) { son[rt].value=w; son[rt].nv=w; return; } if(son[rt].nv) { son[rt<<1].nv=son[rt].nv; son[rt<<1|1].nv=son[rt].nv; son[rt<<1].value=son[rt].nv; son[rt<<1|1].value=son[rt].nv; son[rt].nv=0; } int m=(son[rt].l+son[rt].r)/2; if(r<=m) Update_n(w,l,r,rt<<1); else if(l>m) Update_n(w,l,r,rt<<1|1); else { Update_n(w,lson); Update_n(w,rson); } PushUp(rt); } ll Query(int l,int r,int rt) { if(son[rt].l==l&&son[rt].r==r) { return son[rt].value; } if(son[rt].nv) { son[rt<<1].nv=son[rt].nv; son[rt<<1|1].nv=son[rt].nv; son[rt<<1].value=son[rt].nv; son[rt<<1|1].value=son[rt].nv; son[rt].nv=0; } ll ret=0; int m=(son[rt].l+son[rt].r)/2; if(r<=m) ret=Query(l,r,rt<<1); else if(l>m) ret=Query(l,r,rt<<1|1); else { ret=Query(lson); ret=ret|Query(rson); } //PushUp(rt); return ret; } int main() { init(); int n,m,t,l,r; ll w; char s[4]; while(scanf("%d%d%d",&n,&t,&m)!=EOF) { Build(1,n,1); for(int i=1; i<=m; i++) { scanf("%s",s); if(s[0]=='C') { scanf("%d%d%I64d",&l,&r,&w); if(l>r) swap(l,r); Update_n(P_2[w],l,r,1); } else { scanf("%d%d",&l,&r); if(l>r) swap(l,r); ll ans=0,v=Query(l,r,1); while(v) //得到代表颜色的2进制数,把不同的颜色数目求出来 { if(v%2) ans++; v>>=1; } printf("%I64d\n",ans); } } } return 0; } /* 挺好玩的一道题目,题目的意思给定一块木板,分成l段,我们进行两种操作, 一种是指定l-r段涂成同一种颜色,一种是查询l-r区间中不同的颜色数。 因为颜色数比较少,这里我们可以使用位操作来记录短浅区间中一共有多少种颜色, 也就是位运算”或“,具体见代码吧。 */
poj 2777 Count Color(线段树),布布扣,bubuko.com
标签:des style blog color 使用 os io strong
原文地址:http://blog.csdn.net/knight_kaka/article/details/38582855