您的位置:首页 > 其它

hdu 5023 A Corrupt Mayor's Performance Art

2014-09-21 21:29 246 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5023

题意:

P是将区间 a 到 b 染成颜色 c 

Q是询问区间 a  到 b 内的颜色

然后按照顺序输出。

思路:

因为颜色只有30种利用二进制来表示。

#include <stdio.h>
#include <iostream>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;

const int maxn = 1100005;
int tree[maxn<<2];
int flag[maxn<<2];

void PushUp(int rt){
tree[rt] = tree[rt<<1]|tree[rt<<1|1];
}
void PushDown(int rt){
if(flag[rt]){
flag[rt<<1] = flag[rt<<1|1] = 1;
tree[rt<<1] = tree[rt];
tree[rt<<1|1] = tree[rt];
flag[rt] = 0;
}
}

void build(int l,int r,int rt){
flag[rt] = 0;
tree[rt] = 2;
if(l == r)
return;
int m = (l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
}

void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && r<=R){
tree[rt] = c;
flag[rt] = 1;
return;
}
PushDown(rt);
int m = (l+r)>>1;
if(L <= m)
update(L, R, c, lson);
if(R > m)
update(L, R, c, rson);
PushUp(rt);
}

int res;
int query(int L,int R,int l,int r,int rt){
if(flag[rt] || (L<=l && r<=R))
return tree[rt];
PushDown(rt);
int m = (l+r)>>1;
if(L<=m)
res |= query(L, R, lson);
if(R > m)
res |= query(L, R, rson);
return res;
}

int main(){
int n,m;
while(~scanf("%d%d",&n,&m)&&(n||m)){
char qq[2];
int a,b,c;
build(1, n, 1);
for(int i = 0;i < m;i++){
scanf("%1s",qq);
if(qq[0] == 'P'){
scanf("%d%d%d",&a,&b,&c);
update(a, b, 1<<(c-1), 1, n, 1);
}
else{
res = 0;
scanf("%d%d",&a,&b);
//printf("%d\n",query(a, b, 1, n, 1));
int temp = query(a, b, 1, n, 1);
int cnt = 0;
int ans[32];
for(int i = 0;i < 31;i++){
if(temp&(1<<i))
ans[cnt++] = i + 1;
}
printf("%d",ans[0]);
for(int i = 1;i < cnt;i++)
printf(" %d",ans[i]);
printf("\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: