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;
}

UOJ25——IOI2014Wall的更多相关文章

随机推荐

  1. 日志模块logging使用心得

    在应用程序使用中,日志输出对应用维护人员.开发人员判断程序的问题起重要作用. 那么在python中如何定义程序的日志输出? 推荐使用日志模块logging 需求:实现日志内容输出在文件中和控制器中 i ...

  2. gnuplot conditional plotting: plot col A:col B if col C == x

    http://stackoverflow.com/questions/6564561/gnuplot-conditional-plotting-plot-col-acol-b-if-col-c-x H ...

  3. cocos2d 3.6 win7下的配置

    我搭建cocos2.6的开发环境需要安装工具包括: 1.Visual Studio 2012(由于不兼容win7,需要安装Update 4)和虚拟光驱daemon tool,虚拟光驱的下载地址:htt ...

  4. sed delete

    sed -i '1d' a.txt删首行 sed -i '$d' b.txt删尾行 sed -i 's/[ ]//g' c.txt删空格 sed -i '/^$/d' d.txt删空行 sed -i ...

  5. Linux防火墙:iptables禁IP与解封IP常用命令

    在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...

  6. Java——其他容器

    除了JFrame表示之外,还有其他几种常见的窗体:JPanel.JSplitPane.JTabbedPane.JScrollPane.JDesktopPane.JInternalFrame等. imp ...

  7. Tomcat web.xml中定义了文件扩展名到MIME类型的对应关系

    Tomcat在返回静态资源时,会根据资源文件的扩展名产生对应的content-type头(也即MIME类型)添加到response header中. 在Tomcat的web.xml规定了扩展名及相应M ...

  8. Photoshop 融合属性 Unity Shader

    http://forum.unity3d.com/threads/free-photoshop-blends.121661/

  9. Install Mono and MonoDevelop on Fedora

    http://www.mono-project.com/docs/getting-started/install/linux/ http://www.monodevelop.com/download/ ...

  10. vi/vim使用小结

    1.三种模式: •Command mode 命令模式,用于输入命令,简单更改. •Insert mode 插入模式,用于插入文本. •Last line mode 末行模式,用于输入命令.视化操作.查 ...