[UOJ 25] [IOI 2014] Wall 【线段树】
题目链接:UOJ - 25
题目分析
每个操作就是将被操作的数限制在一个区间,比如 Set_Max(5) 就是将被操作的数限定在了 [5, INF] 的区间里。
这些操作是可加的,但是必须按照顺序,不满足交换律。
对每个节点维护两个标记 Min_Tag[x], Max_Tag[x] ,表示这个节点的数被限制在了 [Max_Tag, Min_Tag] 的区间内。
最终的答案应该是 gmax(Max_Tag[x], gmin(MinTag[x], Val[x]))。其中 Val[x] 是 x 这个位置的初值。
对某一个节点进行 Set_Max(Num) 时,就是进行这样的操作: Max_Tag[x] = gmax(Max_Tag[x], Num); Min_Tag[x] = gmax(Min_Tag[x], Num);
对某一个节点进行 Set_Min(Num) 时,就是进行这样的操作: Max_Tag[x] = gmin(Max_Tag[x], Num); Min_Tag[x] = gmin(Min_Tag[x], Num);
PushDown(x) 的时候就是用 x 的 Max_tag, Min_Tag 对 x 的孩子进行操作。
这样维护两个标记,最后取答案的时候再用 gmax(Max_Tag[x], gmin(MinTag[x], Val[x])) 取答案就行了,不过这道题中初值都是0。
代码
#include "wall.h" const int MaxN = 2000000 + 5, MaxH = 100000 + 5; int Min_Tag[MaxN * 4], Max_Tag[MaxN * 4]; void Build(int x, int s, int t)
{
if (s == t)
{
Min_Tag[x] = MaxH;
Max_Tag[x] = -MaxH;
return;
}
Min_Tag[x] = MaxH;
Max_Tag[x] = -MaxH;
int m = (s + t) >> 1;
Build(x << 1, s, m);
Build(x << 1 | 1, m + 1, t);
} inline int gmin(int a, int b) {return a < b ? a : b;}
inline int gmax(int a, int b) {return a > b ? a : b;} inline void Paint_Max(int x, int Num)
{
Max_Tag[x] = gmax(Max_Tag[x], Num);
Min_Tag[x] = gmax(Min_Tag[x], Num);
} inline void Paint_Min(int x, int Num)
{
Max_Tag[x] = gmin(Max_Tag[x], Num);
Min_Tag[x] = gmin(Min_Tag[x], Num);
} inline void PushDown(int x)
{
Paint_Max(x << 1, Max_Tag[x]);
Paint_Max(x << 1 | 1, Max_Tag[x]);
Max_Tag[x] = -MaxH;
Paint_Min(x << 1, Min_Tag[x]);
Paint_Min(x << 1 | 1, Min_Tag[x]);
Min_Tag[x] = MaxH;
} void Set_Max(int x, int s, int t, int l, int r, int Num)
{
if (l <= s && r >= t)
{
Paint_Max(x, Num);
return;
}
PushDown(x);
int m = (s + t) >> 1;
if (l <= m) Set_Max(x << 1, s, m, l, r, Num);
if (r >= m + 1) Set_Max(x << 1 | 1, m + 1, t, l, r, Num);
} void Set_Min(int x, int s, int t, int l, int r, int Num)
{
if (l <= s && r >= t)
{
Paint_Min(x, Num);
return;
}
PushDown(x);
int m = (s + t) >> 1;
if (l <= m) Set_Min(x << 1, s, m, l, r, Num);
if (r >= m + 1) Set_Min(x << 1 | 1, m + 1, t, l, r, Num);
} void Get_Ans(int x, int s, int t, int *&P)
{
if (s == t)
{
*P++ = gmax(Max_Tag[x], gmin(0, Min_Tag[x]));
return;
}
PushDown(x);
int m = (s + t) >> 1;
Get_Ans(x << 1, s, m, P);
Get_Ans(x << 1 | 1, m + 1, t, P);
} void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
Build(1, 1, n);
for (int i = 0; i < k; ++i)
{
if (op[i] == 1) Set_Max(1, 1, n, left[i] + 1, right[i] + 1, height[i]);
else Set_Min(1, 1, n, left[i] + 1, right[i] + 1, height[i]);
}
int *P = finalHeight;
Get_Ans(1, 1, n, P);
return;
}
[UOJ 25] [IOI 2014] Wall 【线段树】的更多相关文章
- [UOJ UNR#1]奇怪的线段树
来自FallDream的博客,未经允许,请勿转载, 谢谢. 原题可以到UOJ看,传送门 如果存在一个点是白的,却有儿子是黑的,显然无解. 不然的话,只要所有黑色的“黑叶子”节点,即没有黑色的儿子的节点 ...
- [UOJ#334][NOIP2017]列队 平衡树/线段树/树状数组
题目链接 题意不说了,一辈子也忘不掉 解法1.平衡树 这题就是平衡树裸题,每一行开一棵维护前 \(m-1\) 个,最后一列单独维护,因为很多人没有用到,所以平衡树每个节点是一个区间(pair),分裂时 ...
- 2018.07.25 hdu5306Gorgeous Sequence(线段树)
传送门 线段树基本操作. 要求维护区间取min" role="presentation" style="position: relative;"> ...
- UOJ#467. 【ZJOI2019】线段树 线段树,概率期望
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...
- UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化,设离散化后的值域为 $[0,m]$ . 首先把问题转化一下,变成:对于每一个位置 $i$ ...
- uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...
- UOJ46 【清华集训2014】玄学 【时间线段树】
题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...
随机推荐
- JSP内置对象整理(转)
① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...
- mybatis02 架构
SqlMapConfig.xml(mybatis全局配置文件加载mybatis环境(数据源,事物,mapper.xml(配置sql语句),),类似于hibernate的全局配置文件,用于加载hiber ...
- Btrace
http://www.iteye.com/topic/1005918 背景 周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译). 一些关于btrace的基本内容,可以看下我早起 ...
- mysql 导入excel 或 .csv
第一步 导出excel 去掉列头,设置文本里面格式
- 关于js中return false、event.preventDefault()和event.stopPropagation()
在平时项目中,如果遇到需要阻止浏览器默认行为,大家经常会用return false;和event.preventDefault()来阻止,但对它俩的区别还是有些一知半解,于是看了文档,查了些资料,在此 ...
- Amazon S3 上传文件 SSL23_GET_SERVER_HELLO握手错误
题外话:今天偶尔来逛逛,发现我真是懒到家了.居然有半年前的留言我都没有来看过,真对不起留言的同学,希望他的问题已经解决了. 这两三天一直被亚马逊S3上传文件的问题困扰着,直到昨天晚上终于搞定了,工作群 ...
- Prototype 原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式即在运行时动态的通过一个对象的实例来创建这个类的对象,可以理解成通过一个实例克隆出另一个实例. Prototype模式的一些优 ...
- asp.net各种获取客户端ip方法
Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ...
- 多线程、Socket
多线程 线程.进程和应用程序域 进程:进程是一个操作系统上的概念,用来实现多任务并发执行,是资源分配的最小单元,各个进程是相互独立的,可以理解为执行当中的程序,在操作系统中一般用一个称为PCB的结 ...
- oracle数据库的导出与导入
导出:exp devtest10/dev10@172.16.7.39:1521/WSRZ file=d:\WSRZ.dmp log=d:\WSRZ.log full=y 导入:imp testdb/t ...