4364: [IOI2014]wall砖墙

链接

分析:

  线段树,维护一个最大值,一个最小值。

代码:

 #include<bits/stdc++.h>

 char buf[],*p1 = buf,*p2 = buf;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2) ? EOF :*p1++)
inline int read() {
int x=,f=;char ch=nc();for(;!isdigit(ch);ch=nc())if(ch=='-')f=-;
for (;isdigit(ch);ch=nc())x=x*+ch-'';return x*f;
} const int N = ;
int mn[N<<],mx[N<<]; #define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define Root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1 inline void pushup(int rt) {
mn[rt] = min(mn[rt<<],mn[rt<<|]);
mx[rt] = max(mx[rt<<],mx[rt<<|]);
}
inline void pushdown(int rt) { // 使左右儿子的最小最大值 也在 根节点的最小最大值之间。
if (mn[rt] > mx[rt<<]) mn[rt<<] = mx[rt<<] = mn[rt];
else if (mn[rt] > mn[rt<<]) mn[rt<<] = mn[rt];
if (mn[rt] > mx[rt<<|]) mn[rt<<|] = mx[rt<<|] = mn[rt];
else if (mn[rt] > mn[rt<<|]) mn[rt<<|] = mn[rt]; if (mx[rt] < mn[rt<<]) mn[rt<<] = mx[rt<<] = mx[rt];
else if (mx[rt] < mx[rt<<]) mx[rt<<] = mx[rt];
if (mx[rt] < mn[rt<<|]) mn[rt<<|] = mx[rt<<|] = mx[rt];
else if (mx[rt] < mx[rt<<|]) mx[rt<<|] = mx[rt];
}
void update1(int l,int r,int rt,int L,int R,int h) { // 提高
if (L <= l && r <= R) {
mn[rt] = max(mn[rt],h); // 取max:高于h的不更新
mx[rt] = max(mx[rt],h);
return ;
}
pushdown(rt);
int mid = (l + r) >> ;
if (L <= mid) update1(lson,L,R,h);
if (R > mid) update1(rson,L,R,h);
pushup(rt);
}
void update2(int l,int r,int rt,int L,int R,int h) { // 降低
if (L <= l && r <= R) {
mn[rt] = min(mn[rt],h); // 取min:低于h的不更新
mx[rt] = min(mx[rt],h);
return ;
}
pushdown(rt);
int mid = (l + r) >> ;
if (L <= mid) update2(lson,L,R,h); // -- update1
if (R > mid) update2(rson,L,R,h);
pushup(rt);
}
void print(int l,int r,int rt) {
if (l == r) {
printf("%d\n",mn[rt]);
return;
}
int mid = (l + r) >> ;
pushdown(rt);
print(lson);print(rson);
}
int main() {
int n = read(),m = read();
while (m--) {
int opt = read(),l = read() + ,r = read() + ,h = read();
if (opt==) update1(Root,l,r,h);
else update2(Root,l,r,h);
}
print(Root);
return ;
}

4364: [IOI2014]wall砖墙的更多相关文章

  1. bzoj4364: [IOI2014]wall砖墙

    线段树打标记的好(luo)题 打打标记,记得下移 = =听说2000000是用来卡线段树的 = =怎么办呢,,, = =打个读入优化看看能不能卡过去吧 #include<cstdio> # ...

  2. BZOJ4364: [IOI2014]wall砖墙(线段树)

    题意 题目链接 Sol 一个显然的思路是维护最大最小值以及最大最小值的覆盖标记. https://paste.ubuntu.com/p/WXpBvzF6Y2/ 但实际上因为这题只需要输出最后的操作序列 ...

  3. 【[IOI2014]Wall 砖墙】

    好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...

  4. P4560 [IOI2014]Wall 砖墙

    题目描述 给定一个长度为 nn且初始值全为 00的序列.你需要支持以下两种操作: Add L, R, hL,R,h:将序列 [L, R][L,R]内所有值小于 hh的元素都赋为 hh,此时不改变高度大 ...

  5. LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)

    传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...

  6. [IOI2014]Wall

    [IOI2014]Wall 题目大意: 给你一个长度为\(n(n\le2\times10^6)\)的数列,初始全为\(0\).\(m(m\le5\times10^5)\)次操作,每次让区间\([l_i ...

  7. 「IOI2014」Wall 砖墙

    题目描述 给定一个初始元素为 \(0\) 的数列,以及 \(K\) 次操作: 将区间 \([L, R]\) 中的元素对 \(h\) 取 \(max\) 将区间 \([L, R]\) 中的元素对 \(h ...

  8. BZOJ4364:[IOI2014]Wall

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. CRUD全栈式编程架构之服务层的设计

    服务层代码 首先我先放出2个主要类的代码再分别讲解 接口 using System; using System.Collections.Generic; using System.Linq; usin ...

  2. OC 类 的声明

    Student.h // @interface代表声明一个类 // : 代表继承 @interface Student : NSObject { // 成员变量要定义在下面的大括号中{} int ag ...

  3. STL - rope 【强大的字符串处理容器】

    包含头文件: #include<ext/rope> using namespace __gnu_cxx; 申请: rope text; 基本操作: test.push_back(x); / ...

  4. Strtus2框架使用HttpServletResponse响应数据

    -----------------------------------------------------------------------------------------jsp-------- ...

  5. Java之生成条形码、PDF、HTML

    关于Java生成HTML,可参考我的这篇文章:FreeMarker之根据模型生成HTML代码 当然了,该篇文章也会给你很多启发,比如,根据html生成html,大家不要小看这个,著名的WordPres ...

  6. 学大伟业 Day 2 培训总结

    一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...

  7. java循环作业0912

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? double a = 0.08; double h =0; int i=0; for(i=1;h&l ...

  8. VMware虚拟机修改BIOS启动项

    vmware默认是硬盘启动,要进bios里面设置成开机的启动顺序,要将光盘设置成第一启动项.但vm的开机画面比笔记本的还要快很多,基本都在1s内的,想进入 bios里面也有难度.. 对于网上说的开vm ...

  9. ipython notebook开通远程

    之前只是会用,别人告诉我命令和大概怎么设置的,今天自己搭建才发现一知半解搞不定啊. 目的:远程通过ipython notebook调用服务器. 服务器是ubuntu16.04 本地机器win7 配置方 ...

  10. linux多线程编程基本操作(2)

    linux c多线程总结: :关于线程和进程 a:使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.我们知道,在Linux系统下,启动一个新的进程必须分配给 ...