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. spring---aop 配置

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  2. mongdb查询与排序

    db.QResult.find({'CreateDate':{'$gte' : ISODate('2016-07-01'), '$lte' : ISODate('2016-08-01')}}).sor ...

  3. NodeJS Debugger

    http://cnodejs.org/topic/4f16442ccae1f4aa27001105 http://blog.csdn.net/ygh_0912/article/details/9108 ...

  4. C++ Scripting

    http://www.quepublishing.com/articles/article.aspx?p=26069

  5. 几个有用的jQuery代码片段

    1.检测Internet Explorer版本 $(document).ready(function() { if (navigator.userAgent.match(/msie/i) ){ ale ...

  6. IsPostBack--Asp.net

    .net程序员首先需要了解什么是IsPostBack.msdn上边有IsPostBack的定义:获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问.如果是为响应客户端回 ...

  7. DNS域传送漏洞利用

    DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因 ...

  8. Python之路【第八篇】python实现线程池

    线程池概念 什么是线程池?诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就 ...

  9. Ubuntu 源码安装 nginx 1.9.2

    安装前准备: //更新系统 1.sudo apt-get update //安装pcre包 2.sudo apt-get install libpcre3 libpcre3-dev   3.sudo  ...

  10. easyui的textbox和validatebox的 赋值区别

    区别代码如下: textbox:$('userId').textbox('setValue','aaa'); validatebox :$('userId').val('aaa');