好像随便一卡就最优解了

malao告诉我这道题挺不错的,于是就去写了写

这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧

但是并没有什么区间查询,只是在最后输出整个序列

于是我们就直接用线段树维护

设置两个标记\(tag[0],tag[1]\),分别表示对应区间的最小值和最大值

初始值我们分别设成\(-inf\)和\(inf\)

之后我们分别维护就好了

如果是\(1\)操作我们要把区间的最小值更新,但是如果原来区间的最小值大于当前的值,那么就不更新

同时如果这个区间的最大值比需要更新的值还小,那么最大值也一起更新

操作\(2\)还有标记下放同理

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 2000005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 100002
int l[maxn<<2],r[maxn<<2],tag[2][maxn<<2];
int n,Q;
void write(int x)
{
if(x>9) write(x/10);
putchar(x%10+48);
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
void build(int x,int y,int i)
{
l[i]=x,r[i]=y;
if(x==y) return;
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
tag[1][i]=INF,tag[0][i]=-INF;
}
inline void pushdown(int i)
{
if(tag[0][i]!=-INF)
{
tag[0][i<<1]=max(tag[0][i],tag[0][i<<1]);
tag[1][i<<1]=max(tag[1][i<<1],tag[0][i]);
tag[0][i<<1|1]=max(tag[0][i],tag[0][i<<1|1]);
tag[1][i<<1|1]=max(tag[1][i<<1|1],tag[0][i]);
tag[0][i]=-INF;
}
if(tag[1][i]!=INF)
{
tag[1][i<<1]=min(tag[1][i],tag[1][i<<1]);
tag[0][i<<1]=min(tag[0][i<<1],tag[1][i]);
tag[1][i<<1|1]=min(tag[1][i<<1|1],tag[1][i]);
tag[0][i<<1|1]=min(tag[0][i<<1|1],tag[1][i]);
tag[1][i]=INF;
}
}
void change(int op,int val,int x,int y,int i)
{
if(x<=l[i]&&y>=r[i])
{
if(op)
{
if(val<tag[op][i]) tag[op][i]=val;
if(tag[0][i]>val) tag[0][i]=val;
}
if(!op)
{
if(val>tag[op][i]) tag[op][i]=val;
if(tag[1][i]<val) tag[1][i]=val;
}
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) change(op,val,x,y,i<<1);
else if(x>mid) change(op,val,x,y,i<<1|1);
else change(op,val,x,y,i<<1),change(op,val,x,y,i<<1|1);
}
void print(int i)
{
if(l[i]==r[i])
{
write(tag[0][i]);
putchar(10);
return;
}
pushdown(i);
print(i<<1);
print(i<<1|1);
}
int main()
{
n=read(),Q=read();
build(0,n-1,1);
int opt,x,y,h;
while(Q--)
{
opt=read(),x=read(),y=read(),h=read();
change(opt-1,h,x,y,1);
}
print(1);
return 0;
}

【[IOI2014]Wall 砖墙】的更多相关文章

  1. 4364: [IOI2014]wall砖墙

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

  2. bzoj4364: [IOI2014]wall砖墙

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

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

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

  4. P4560 [IOI2014]Wall 砖墙

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

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

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

  6. [IOI2014]Wall

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

  7. 「IOI2014」Wall 砖墙

    题目描述 给定一个初始元素为 \(0\) 的数列,以及 \(K\) 次操作: 将区间 \([L, R]\) 中的元素对 \(h\) 取 \(max\) 将区间 \([L, R]\) 中的元素对 \(h ...

  8. BZOJ4364:[IOI2014]Wall

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Spring MVC 实现Excel的导入导出功能(2:Excel的导入优化和Excel的导出)

    Excel的导入V2优化版 有些时候文件上传这一步骤由前端来处理,只将上传后的 URL 传输给后端(可以参考上一文中的图片上传功能),也就是导入请求中并不会直接处理 MultipartFile 对象, ...

  2. golang 的 sync.WaitGroup

    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for ...

  3. poj 3104 dring 二分

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7684   Accepted: 1967 Descriptio ...

  4. DevExpress13.2.9 控件使用经验总结

    一.换肤功能 1. 添加 DevExpress.OfficeSkins 和 DevExpress.BonusSkins 两个引用 2. 皮肤注册 DevExpress.UserSkins.BonusS ...

  5. unity3d之使用技巧

    知乎 project.hierarchy折叠打开全部文件夹——alt +方向键

  6. js中contains()方法的了解

    今天第一次碰到了contains()方法,处于好奇了解了一下:发现在某些场合还是挺有用的. contains(),js原生方法,用于判断DOM元素的包含关系: 需要注意的是:它以HTMLElement ...

  7. HTML表单相关

    表单:<input type="text" name="" value="" size="显示字符数" maxle ...

  8. GoJs实现流程管理图

    GoJS是一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库. 可以加入诸多功能.如流程判断,节点处理等等.GOJS在设计上极大的减轻了开发人员的开发成本.

  9. Java多线程学习笔记(一)

    一 概述 一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建. package link.summer7c.test; public class ...

  10. 连接到 Azure 上的 SQL Server 虚拟机(经典部署)

    概述 本主题介绍如何连接到运行于 Azure 虚拟机的 SQL Server 实例. 它介绍了一些常规连接方案,并提供了在 Azure VM 中配置 SQL Server 连接的详细步骤. Impor ...