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 ...
 
随机推荐
- hdu-4288 Coder---线段树+离线处理&离散化
			
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4288 题目大意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3 ...
 - POJ 3321 DFS序
			
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30636 Accepted: 9162 Descr ...
 - html基本代码书写
			
html的书写: datagrid---->toolbar---->按钮---->handler:function() var rows=$("gridId"). ...
 - 【洛谷P3811】[模板]乘法逆元
			
乘法逆元 题目链接 求逆元的三种方式: 1.扩欧 i*x≡1 (mod p) 可以化为:x*i+y*p=1 exgcd求x即可 inline void exgcd(int a,int b,int &a ...
 - 【luogu P3379 最近公共祖先】 模板
			
题目链接:https://www.luogu.org/problemnew/show/P3379 倍增求lca,先存下板子,留个坑以后再填讲解. in 5 5 43 12 45 11 42 43 23 ...
 - 与JSON相关的问题
			
1.JSON.stringify 与 JSON.parse 相关的问题 JSON.stringify 把字符串转化为字符串,JSON.parse把字符串转化为JSON格式 会出现的问题Unexpect ...
 - IP检验字段为啥只检验地址部分
			
在首部中的错误比在数据中的错误更重 如:一个错误的地址可能导致分组被投递到错误的主机.许多主机并不检查投递给它们的分组是否 确定是要投递给它们,它们假定网络从来不会把别人的分组包传递给自己.数据不参加 ...
 - 【SQL】Oracle的交集、并集、差集
			
假设有表tableA.tableB,他们都有字段id和name 交集:INTERSECT (适用于两个结果集) select a.id, a.name from tableA a INTERSECT ...
 - SQL里的concat() 以及group_concat() 函数的使用
			
实例参考:https://blog.csdn.net/mary19920410/article/details/76545053 一 concat()函数 1.功能:将多个字符串连接成一个字符串. 2 ...
 - Centos防火墙的配置
			
Selinux的三种模式:enforcing,passive,disable 临时更改模式:setengorce 1|0 1:enforcing, 0:passive [root@C ...