hdu 5023 A Corrupt Mayor's Performance Art

題目: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;
}


發佈了229 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章