LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)
解题思路
线段树打标记,刚开始想复杂了,维护了四个标记。后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int MAXN = 2000005;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n,a[MAXN],high[MAXN<<2],low[MAXN<<2],m;
inline int min(int x,int y){
return x<y?x:y;
}
inline int max(int x,int y){
return x>y?x:y;
}
inline void pushdown(int x,int l,int r){
int mid=(l+r)>>1;
if(l==r) {
if(low[x]!=-1) a[l]=min(a[l],low[x]);
if(high[x]!=-1) a[l]=max(a[l],high[x]);
return ;
}
if(low[x]!=-1) {
if(low[x<<1]!=-1) low[x<<1]=min(low[x<<1],low[x]);
else low[x<<1]=low[x];
if(high[x<<1]>low[x]) high[x<<1]=low[x];
if(low[x<<1|1]!=-1) low[x<<1|1]=min(low[x<<1|1],low[x]);
else low[x<<1|1]=low[x];
if(high[x<<1|1]>low[x]) high[x<<1|1]=low[x];
low[x]=-1;
}
if(high[x]!=-1){
high[x<<1]=max(high[x<<1],high[x]);
if(high[x]>low[x<<1] && low[x<<1]!=-1) low[x<<1]=high[x];
high[x<<1|1]=max(high[x<<1|1],high[x]);
if(high[x]>low[x<<1|1] && low[x<<1|1]!=-1) low[x<<1|1]=high[x];
high[x]=-1;
}
}
void update_h(int x,int l,int r,int L,int R,int k){
if(L<=l && r<=R) {
high[x]=max(high[x],k);
if(low[x]!=-1 && low[x]<k) low[x]=k;
if(l==r) {
if(low[x]!=-1) a[l]=min(a[l],low[x]);
if(high[x]!=-1) a[l]=max(a[l],high[x]);
}
return ;
}
int mid=(l+r)>>1;pushdown(x,l,r);
if(L<=mid) update_h(x<<1,l,mid,L,R,k);
if(mid<R) update_h(x<<1|1,mid+1,r,L,R,k);
}
void update_l(int x,int l,int r,int L,int R,int k){
if(L<=l && r<=R) {
if(low[x]==-1) low[x]=k;
else low[x]=min(low[x],k);
if(high[x]!=-1 && high[x]>k) high[x]=k;
if(l==r){
if(low[x]!=-1) a[l]=min(a[l],low[x]);
if(high[x]!=-1) a[l]=max(a[l],high[x]);
}
return ;
}
int mid=(l+r)>>1;pushdown(x,l,r);
if(L<=mid) update_l(x<<1,l,mid,L,R,k);
if(mid<R) update_l(x<<1|1,mid+1,r,L,R,k);
}
void query(int x,int l,int r){
if(l==r) {pushdown(x,l,r);printf("%d\n",a[l]);return ;}
int mid=(l+r)>>1;pushdown(x,l,r);
query(x<<1,l,mid);query(x<<1|1,mid+1,r);
}
int main(){
memset(low,-1,sizeof(low));
memset(high,-1,sizeof(high));
n=rd(),m=rd();int op,l,r,k;
while(m--){
op=rd(),l=rd(),r=rd(),k=rd();l++;r++;
if(op==1) update_h(1,1,n,l,r,k);
else update_l(1,1,n,l,r,k);
}
query(1,1,n);
return 0;
}
LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)的更多相关文章
- BZOJ4364: [IOI2014]wall砖墙(线段树)
题意 题目链接 Sol 一个显然的思路是维护最大最小值以及最大最小值的覆盖标记. https://paste.ubuntu.com/p/WXpBvzF6Y2/ 但实际上因为这题只需要输出最后的操作序列 ...
- P4560 [IOI2014]Wall 砖墙
题目描述 给定一个长度为 nn且初始值全为 00的序列.你需要支持以下两种操作: Add L, R, hL,R,h:将序列 [L, R][L,R]内所有值小于 hh的元素都赋为 hh,此时不改变高度大 ...
- 4364: [IOI2014]wall砖墙
4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- 【原创】洛谷 LUOGU P3373 【模板】线段树2
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...
- 【原创】洛谷 LUOGU P3372 【模板】线段树1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
- 【Luogu P3834】可持久化线段树(主席树)
Luogu P3834 可持久化数据结构就是支持在历史版本上进行查询和修改操作的数据结构. 主席树就是对线段树的改进,使之可持久化. 前置知识:动态开点线段树 我们利用权值(值域)线段树统计区间内的数 ...
- 「Luogu P5494 【模板】线段树分裂」
(因为没有认证,所以这道题就由Froggy上传) 线段树分裂用到的地方确实并不多,luogu上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一些其他的算法水过去. ...
随机推荐
- SSM框架整合依赖
<dependencies> <!--mybatis核心jar包--> <dependency> <groupId>org.mybatis</gr ...
- PHP ftp_login() 函数
定义和用法 ftp_login() 函数登录 FTP 服务器. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_login(ftp_connection,us ...
- Shiro学习(6)Realm整合
6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系 即用户-角色之间 ...
- APICloud框架--sublime使用自定义loader
官方的apploader调试器,只是有官方的一些模块,如果我们使用非官方的模块就要使用自定义loader进行调试.接下来就走一边sublime设置自定义loader的步骤 修改config.xml 打 ...
- php 实现的功能
1.php写日志函数 (如:前端请求日志记录) : https://www.cnblogs.com/lvchenfeng/p/6794822.html 2.php中(服务器)使用CURL实现GET和P ...
- TotoiseSVN + VisualSVN Server 使用
1.SVN中 项目文件版本 分服务器的版本和本地的版本.服务器版本(SVN会自动给每个版本加版本号的)永远都是最新的. 2.svn的更新,在文件不冲突的时候,会自动将服务器的版本和本地的版本合并. ...
- 使用 windsor 实现IOC 和 AOP
代码很简单,不多说. 对于拦截,windsor 使用动态代理的方式,即生成继承类的方式来实现的,因此无法拦截private 方法,因为无法在继承类中看见private方法. using System; ...
- 模拟栈&&模拟队列
模拟栈:class Stack { private List list = new ArrayList( ); public void push( Object obj ) { this.list.a ...
- Java异常关闭资源的两种方式
try-catch-finally 常用,在异常关闭时应判断流是否为空 public class CloseableUtils { public static void closeable(Close ...
- RZ、NRZ、NRZI、曼彻斯特编码
Frm: http://blog.sina.com.cn/s/blog_78e87ba10102wj9g.html 在数字电路中,组成一连串信息的基元就是0和1,无论是在CPU.DSP.MCU甚至是个 ...