UOJ25——IOI2014Wall

来源:互联网 发布:php获取服务器信息 编辑:程序博客网 时间:2024/06/01 07:43
1、题目大意:这道题也是线段树修改,有两种修改,一个区间中大于h都变成h,一个区间中小于h都变成h,单点询问
主要是这几种操作
2、分析:这道题是双标记,还是父亲的优先级比儿子低,自己用手推推就可以知道怎么下传标记了(挺好推得),这是一道交互题,

以前从来都没有做过交互题,做完顿时感觉交互和传统没有太大的区别。。。

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;struct segment_tree{    int milazy[10000000];    int malazy[10000000];    int x,y,z;    int value[10000000];    void init(){        memset(value,0,sizeof(value));        for(int i=1;i<=8000000;i++)milazy[i]=214748364;        memset(malazy,0,sizeof(malazy));        return;    }    void update(int l,int r,int o){        milazy[2*o]=min(milazy[2*o],milazy[o]);malazy[2*o]=min(malazy[2*o],milazy[o]);        milazy[2*o+1]=min(milazy[2*o+1],milazy[o]);malazy[2*o+1]=min(malazy[2*o+1],milazy[o]);        milazy[2*o]=max(milazy[2*o],malazy[o]);malazy[2*o]=max(malazy[2*o],malazy[o]);        milazy[2*o+1]=max(milazy[2*o+1],malazy[o]);malazy[2*o+1]=max(malazy[2*o+1],malazy[o]);        if(l==r){            value[l]=min(milazy[o],value[l]);value[l]=max(malazy[o],value[l]);        }        malazy[o]=0;milazy[o]=214748364;        return;    }    void add_mi(int l,int r,int o){        update(l,r,o);        if(x>r||y<l) return;        if(x<=l&&r<=y){            milazy[o]=z;update(l,r,o);            return;        }        int mid=(l+r)/2;        add_mi(l,mid,2*o);add_mi(mid+1,r,2*o+1);        return;    }    void add_ma(int l,int r,int o){        update(l,r,o);        if(x>r||y<l)return;        if(x<=l&&r<=y){            malazy[o]=z;update(l, r, o);            return;        }        int mid=(l+r)/2;        add_ma(l,mid,2*o);add_ma(mid+1,r,2*o+1);        return;    }    int query(int l,int r,int o){        update(l,r,o);        if(x>r||x<l)return 0;        if(l==r&&l==x){            return value[l];        }        int mid=(l+r)/2;int ret1,ret2;        ret1=query(l,mid,2*o);ret2=query(mid+1,r,2*o+1);        return max(ret1,ret2);    }} wt;void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){    wt.init();    for(int i=0;i<k;i++){        if(op[i]==1){            wt.x=left[i]+1;wt.y=right[i]+1;wt.z=height[i];            wt.add_ma(1,n,1);        }        else{            wt.x=left[i]+1;wt.y=right[i]+1;wt.z=height[i];            wt.add_mi(1,n,1);        }    }    for(int i=1;i<=n;i++){        wt.x=i;        finalHeight[i-1]=wt.query(1,n,1);    }    return;}


0 0