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上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一些其他的算法水过去. ...
随机推荐
- Java——main()方法
3.1 main()方法 由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static ...
- IReport实践指南
IReport实践指南 前言 最近,在做一个电子签章的功能,然后就接触到IReport报表,经过好几天的摸索实践,功能已经完成了,今天来总结一下. 什么是IReport,IReport是JasperR ...
- Redis Cluster集群详介绍和伪集群搭建
1 什么是Redis-Cluster 为何要搭建Redis集群.Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系 ...
- go routine
无缓冲 channel 是在多个 goroutine 之间同步很棒的工具. 当在 Go 中用 ch := make ( chan bool ) 创建 chennel 时,bool 型的 无缓冲 cha ...
- fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
最近想用一下Xtreme ToolkitPro 界面库,安装后用VC6根据向导 产生一个工程,编译时出现如下的错误: fatal error C1076: compiler limit : inter ...
- jQuery 封装的ajax
jquery封装的ajax 具体操作: $.get(url [,data] [,fn回调函数] [, dataType]); data:给服务器传递的数据,请求字符串 .json对象 都可以设 ...
- C# 中如何输出双引号(转义字符的使用)
实现效果: 输出这样的一个含有双引号的字符串 "hello" 方式一: 不用 @ 时转义 System.Console.WriteLine("\"he ...
- 10. Python面向对象
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.如果接触过java语言同学应该都知道,Java面向对象三大特征是:封装.继承.多态.Pytho ...
- 机器学习技法笔记:Homework #5 特征变换&Soft-Margin SVM相关习题
原文地址:https://www.jianshu.com/p/6bf801bdc644 特征变换 问题描述 程序实现 # coding: utf-8 import numpy as np from c ...
- ThreadLocal浅析
1.ThreadLocal的大体理解 ThreadLocal 又名 线程局部变量,是 Java 中一种较为特殊的 线程绑定机制,可以为每一个使用该变量的线程都提供一个变量值的副本,并且每一个线程都可以 ...