浅谈区间最值操作与历史最值问题: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的更多相关文章

  1. [IOI2014]Wall

    [IOI2014]Wall 题目大意: 给你一个长度为\(n(n\le2\times10^6)\)的数列,初始全为\(0\).\(m(m\le5\times10^5)\)次操作,每次让区间\([l_i ...

  2. 4364: [IOI2014]wall砖墙

    4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...

  3. bzoj4364: [IOI2014]wall砖墙

    线段树打标记的好(luo)题 打打标记,记得下移 = =听说2000000是用来卡线段树的 = =怎么办呢,,, = =打个读入优化看看能不能卡过去吧 #include<cstdio> # ...

  4. BZOJ4364: [IOI2014]wall砖墙(线段树)

    题意 题目链接 Sol 一个显然的思路是维护最大最小值以及最大最小值的覆盖标记. https://paste.ubuntu.com/p/WXpBvzF6Y2/ 但实际上因为这题只需要输出最后的操作序列 ...

  5. P4560 [IOI2014]Wall 砖墙

    题目描述 给定一个长度为 nn且初始值全为 00的序列.你需要支持以下两种操作: Add L, R, hL,R,h:将序列 [L, R][L,R]内所有值小于 hh的元素都赋为 hh,此时不改变高度大 ...

  6. 【[IOI2014]Wall 砖墙】

    好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...

  7. LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)

    传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...

  8. Linux编译工具:gcc入门

    1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还 ...

  9. Image Wall - jQuery & CSS3 图片墙效果

    今天我们要为您展示如何基于 jQuery 和 CSS3 创建一个整洁的图片墙效果.我们的想法是在页面上洒上一些大小不同的缩略图,并在当我们点击图片时候显示丝带,会显示一些描述,再次点击缩略图时,丝带将 ...

随机推荐

  1. spring bean实例化的三种方式

    一.使用类的无参构造创建 配置文件 java代码 注意若类里面没有无参的构造,则会出现异常 二.使用静态工厂创建 配置文件 java代码 Factory类 测试类 结果 三.使用实例工厂 配置文件 1 ...

  2. Smarty模板的逻辑运算符号稍微做一下总结

    对Smarty模板的逻辑运算符号稍微做一下总结,以备后用. eq    equal : 相等neq    not equal:不等于gt    greater than:大于lt    less th ...

  3. anaconda + opencv3

    直接运行 pip install opencv-python 或者 pip install opencv-contrib-python 参照如下网页 https://blog.csdn.net/sin ...

  4. 移动端web常见问题解决方案

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对i ...

  5. php中生成随机密码的自定义函数代码

    这篇文章主要分享下php中生成随机密码的方法,原理就是把一些要生成的字符预置一个的字符串包括数字拼音之类的以及一些特殊字符,这样我们再随机取字符组成我们想要的随机密码了 代码一: 生成一个随机密码的函 ...

  6. Effective java -- 5 枚举和注解

    第三十条:用enum代替int常量enum的简单用法. enum Operation { PLUS("+") { double apply(double x, double y) ...

  7. stm32非操作系统开发和带uCos的开发的区别,及一些解析

    从文件角度来看core_cm4.h和stm32f4xx.h分别从内核寄存器和外设寄存器来定义其地址和结构体,是用c语言访问硬件必须的文件,所以这两个文件不论是否带操作系统,都是必须包含进工程的. re ...

  8. hd acm1017

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...

  9. ELK常用API使用方法

    以下ELK系列文章参考自http://www.tianyiqingci.com/ 总目录: Monitor API ElasticSearch聚合分析API Elasticsearch信息检索API ...

  10. Oracle备份和恢复

    --什么是脱机备份 脱机备份也叫冷备份,首先管理员使用 shutdown immediate 命令关闭数据库的服务. 之后复制需要的文件,包括数据文件和控制文件等相关内容复制到磁盘的其他位置.当 数据 ...