4364: [IOI2014]wall砖墙
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砖墙的更多相关文章
- bzoj4364: [IOI2014]wall砖墙
线段树打标记的好(luo)题 打打标记,记得下移 = =听说2000000是用来卡线段树的 = =怎么办呢,,, = =打个读入优化看看能不能卡过去吧 #include<cstdio> # ...
- BZOJ4364: [IOI2014]wall砖墙(线段树)
题意 题目链接 Sol 一个显然的思路是维护最大最小值以及最大最小值的覆盖标记. https://paste.ubuntu.com/p/WXpBvzF6Y2/ 但实际上因为这题只需要输出最后的操作序列 ...
- 【[IOI2014]Wall 砖墙】
好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...
- P4560 [IOI2014]Wall 砖墙
题目描述 给定一个长度为 nn且初始值全为 00的序列.你需要支持以下两种操作: Add L, R, hL,R,h:将序列 [L, R][L,R]内所有值小于 hh的元素都赋为 hh,此时不改变高度大 ...
- LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)
传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...
- [IOI2014]Wall
[IOI2014]Wall 题目大意: 给你一个长度为\(n(n\le2\times10^6)\)的数列,初始全为\(0\).\(m(m\le5\times10^5)\)次操作,每次让区间\([l_i ...
- 「IOI2014」Wall 砖墙
题目描述 给定一个初始元素为 \(0\) 的数列,以及 \(K\) 次操作: 将区间 \([L, R]\) 中的元素对 \(h\) 取 \(max\) 将区间 \([L, R]\) 中的元素对 \(h ...
- BZOJ4364:[IOI2014]Wall
浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- ORACLE常用函数汇总(持续更新中....)
在使用ORACLE过程中,把一些常用的函数的相关用法,注意事项进行简单的汇总,便于自己查询参考. DBMS_RANDOM包 dbms_random是一个可以生成随机数值或者字符串的程序包.这个包有in ...
- OC @protocol(声明协议 )
@protocol Study; int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[[Stud ...
- CF25E Test
嘟嘟嘟 因为只有三个字符串,所以就有一个比较暴力的做法:枚举这三个串所有排列,然后对于每一个排列,减去这三个串两两的公共部分的长度,更新答案. 求公共部分自然想到kmp:比如s[1]接在s[0]后面, ...
- POJ Treasure Exploration 【DAG交叉最小路径覆盖】
传送门:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K To ...
- P2852 [USACO06DEC]牛奶模式Milk Patterns
link 这是一道后缀匹配的模板题 我们只需要将height算出来 然后二分一下答案就可以了 #include<cstdio> #include<algorithm> #inc ...
- UVA - 136 Ugly Numbers(丑数,STL优先队列+set)
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...
- Oracle数据库对象,同义词、序列、视图、索引
数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...
- web常用软件
编辑器: VSCode HBuilder WebStorm NotePad++ Eclipse Atom 常用插件: SwitchyOmega Vue-Tools server类: tomcat Ng ...
- 使用Vscode写python
在python官网下载好python2.x 或者 3.x, 然后在vscode 下载python插件. 写一个python程序, 运行, vscode会自动提示你配置python执行路径,并帮你创建好 ...
- springboot中有用的几个有用aware以及bean操作和数据源操作
本文参考了: https://blog.csdn.net/derrantcm/article/details/76652951 https://blog.csdn.net/derrantcm/arti ...