您的位置:首页 > 其它

HDOJ 5023 A Corrupt Mayor's Performance Art

2014-09-21 01:07 239 查看
//线段树(区间更新)
//用 c++ 交就是RE,换成 g++ 过了
#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 3000010;//这里要稍微开大点,不然容易RE
vector<int>ve;
int y1, y2, v;
int setv[maxn<<2];
void maintain(int o){
    int lc = o * 2, rc = o * 2 + 1;
}
void build_tree(int o, int L, int R){
    int lc = o * 2, rc = o * 2 + 1;
    setv[o] = 2;
    if( L == R )return ;
    int M = ( R + L ) / 2;
    build_tree(lc, L, M);
    build_tree(rc, M+1,R);
}

void pushdown(int o, int L ,int R){
    int lc = o * 2, rc = o * 2 + 1;
    if(setv[o]>0&&setv[o]<=30){
        int M = ( R + L ) / 2;
        setv[lc] = setv[rc] = setv[o];
        setv[o] = -1;
    }
    return ;
}

void update(int o, int l, int r){
    int lc = o*2, rc = o*2+1;
    if(y1<=l&&y2>=r){
        setv[o] = v;return ;
    }
    else
    {
        pushdown(o,l,r);
        int m = (l+r)/2;
        if(y1<=m)update(lc, l, m);
        if(y2>m)update(rc, m+1, r);
    }
}

void query(int o, int l, int r)
{
   if(setv[o]>=0&&setv[o]<=30){
        ve.push_back(setv[o]);
   }
   else {
        int m = (l+r)/2;
        if(y1<=m)query(o*2,l,m);
        if(y2>m)query(o*2+1,m+1,r);
   }
}
int main(){
    //freopen("in.txt","r",stdin);
    int n,m;
    char ch[3];
    while(~scanf("%d%d",&n,&m),n||m){
        ve.clear();
        memset(setv,0,sizeof(setv));
        build_tree(1,1,n);
        for(int i=0;i<m;++i){
            scanf("%s%d%d",ch,&y1,&y2);
            if(ch[0]=='P'){
                scanf("%d",&v);
                update(1,1,n);
            }
            else if(ch[0]=='Q'){
                query(1,1,n);
                sort(ve.begin(),ve.end());
                ve.erase(unique(ve.begin(),ve.end()),ve.end());
                int len = ve.size();
                ve[len] = -1;
                for(int j = 0; j < len; ++j){
                    j == len-1 ? printf("%d\n",ve[j]) : printf("%d ",ve[j]);  
                }
                ve.clear();
            }
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: