标签: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