BZOJ4364:[IOI2014]Wall
浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4364
似乎可以不用吉司机线段树的作法……因为只需要维护区间最大最小值,也只有区间取最大最小值操作,所以可以直接用普通的线段树延迟标记解决这道问题。只要把最大值标记和最小值标记之间的关系处理得当即可。
时间复杂度:\(O((n+m)logn)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=2e6+6,inf=1e9;
int n,m;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct segmemt_tree {
int mx[maxn<<2],mn[maxn<<2];
int tagmx[maxn<<2],tagmn[maxn<<2];
void update(int p) {
mx[p]=max(mx[p<<1],mx[p<<1|1]);
mn[p]=min(mn[p<<1],mn[p<<1|1]);
}
void build(int p,int l,int r) {
tagmx[p]=-inf,tagmn[p]=inf;
if(l==r)return;
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void Max_tag(int p,int v) {
mx[p]=max(mx[p],v),mn[p]=max(mn[p],v);
tagmx[p]=max(tagmx[p],v);tagmn[p]=max(tagmn[p],v);
}
void Min_tag(int p,int v) {
mx[p]=min(mx[p],v),mn[p]=min(mn[p],v);
tagmx[p]=min(tagmx[p],v),tagmn[p]=min(tagmn[p],v);
}
void push_down(int p) {
if(tagmx[p]!=-inf) {
Max_tag(p<<1,tagmx[p]);
Max_tag(p<<1|1,tagmx[p]);
tagmx[p]=-inf;
}
if(tagmn[p]!=inf) {
Min_tag(p<<1,tagmn[p]);
Min_tag(p<<1|1,tagmn[p]);
tagmn[p]=inf;
}
}
void Max(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {
Max_tag(p,v);
return;
}
int mid=(l+r)>>1;push_down(p);
if(L<=mid)Max(p<<1,l,mid,L,R,v);
if(R>mid)Max(p<<1|1,mid+1,r,L,R,v);
update(p);
}
void Min(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {
Min_tag(p,v);
return;
}
int mid=(l+r)>>1;push_down(p);
if(L<=mid)Min(p<<1,l,mid,L,R,v);
if(R>mid)Min(p<<1|1,mid+1,r,L,R,v);
update(p);
}
void print(int p,int l,int r) {
if(l==r) {printf("%d\n",mx[p]);return;}
int mid=(l+r)>>1;push_down(p);
print(p<<1,l,mid),print(p<<1|1,mid+1,r);
}
}T;
int main() {
n=read(),m=read();T.build(1,1,n);
for(int i=1;i<=m;i++) {
int opt=read(),l=read()+1,r=read()+1,v=read();
if(opt==1)T.Max(1,1,n,l,r,v);
else T.Min(1,1,n,l,r,v);
}T.print(1,1,n);
return 0;
}
BZOJ4364:[IOI2014]Wall的更多相关文章
- [IOI2014]Wall
[IOI2014]Wall 题目大意: 给你一个长度为\(n(n\le2\times10^6)\)的数列,初始全为\(0\).\(m(m\le5\times10^5)\)次操作,每次让区间\([l_i ...
- 4364: [IOI2014]wall砖墙
4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...
- bzoj4364: [IOI2014]wall砖墙
线段树打标记的好(luo)题 打打标记,记得下移 = =听说2000000是用来卡线段树的 = =怎么办呢,,, = =打个读入优化看看能不能卡过去吧 #include<cstdio> # ...
- 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,此时不改变高度大 ...
- 【[IOI2014]Wall 砖墙】
好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...
- LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)
传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...
- Linux编译工具:gcc入门
1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还 ...
- Image Wall - jQuery & CSS3 图片墙效果
今天我们要为您展示如何基于 jQuery 和 CSS3 创建一个整洁的图片墙效果.我们的想法是在页面上洒上一些大小不同的缩略图,并在当我们点击图片时候显示丝带,会显示一些描述,再次点击缩略图时,丝带将 ...
随机推荐
- 1.BeanFactory解析
package org.springframework.beans.factory; import org.springframework.beans.BeansException; import o ...
- centos7 mysql允许远程连接设置
Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...
- php7下 xhprof安装与使用
需要测试下 代码的性能,使用了 xhprof + xhgui 1. 下载xhprof, 这里下载吧 :https://github.com/longxinH/xhprof.git 2, 安装 cd x ...
- Basis 基础
[转自 http://www.cnblogs.com/elegantok/archive/2008/11/03/1325163.html] 1 Basis1. Unix操作 更改口令 passwd e ...
- ubuntu安装pip和python
安装pip2sudo apt-get install pip 这样安装的是pip2不支持Python3.x,可以使用如下命令安装pip3 sudo apt-get install python3-pi ...
- HIVE 总结
http://blog.csdn.net/wisgood/article/details/17186181 常见错误 http://blog.csdn.net/sunnyyoona/article/d ...
- python 批量修改预定字符串并将修改后的字符串插入文件指定位置
下面的例子是在文件的指定位置增加指定字符串的例子 修改配置文件: def add_str(pre_str): lines = [] flag = True f = open("z.txt&q ...
- Entity Framework 学习笔记(二)之数据模型 Model 使用过程
Entity Framework 数据模型 Model 创建的使用: 开发环境:VS2012 数据库:SQL Server 2008 Entity Framework 版本:6.12 下面是新建的 ...
- Java -- 反射示例
1. 反射: 即加载和解剖, 用于设计框架, 读取配置档 动态创建对象. Person类,用于反射. package com.kevin.class_test; public class Person ...
- CDH- CDH大数据集群运维
CDH前端CM监控不正常(未解决) Request to the Service Monitor failed. This may cause slow page responses. View th ...