[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 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...
随机推荐
- PCAP 抓包
PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的. WireShark也是用PCAP库来抓取数据包的.PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种 ...
- xshell十大技巧
xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps所有需要,唯一遗憾的是没有官方中文版. 警告:不要下载所谓的汉化版,可能有 ...
- javascript、jsp
1.javascript:简称js 在<body>与 </body>之间 加入<script> </script>即可 最好在<head>与 ...
- AES加解密【示例】
代码 /** * AES算法加密.JRE默认只能用16个字节(128)位密钥 */ public class AESUtils { //使用指定转换的 Cipher 对象 publ ...
- Codeforces Round #310 (Div. 2)--A(简单题)
http://codeforces.com/problemset/problem/556/A 题意:给一个01字符串,把所有相邻的0和1去掉,问还剩下几个0和1. 题解:统计所有的0有多少个,1有多少 ...
- Linux中Curl命令couldn't connect to host解决方案 php操作Curl(http,https)无法获取远程数据解决方案
本人在做百度账户第三方登录接口,获取百度token,利用php操作curl post方式发送请求token,出现couldn't connect to host错误.经过调试测试,最后终于成功.回头写 ...
- MySQL数字类型中的三种常用种类
数字类型 MySQL数字类型按照我的分类方法分为三类:整数类.小数类和数字类. MySQL数字类型之一我所谓的“数字类” 就是指 DECIMAL 和 NUMERIC,它们是同一种类型.它严格的说不是一 ...
- c语言训练题:关于张三李四王五说谎的问题(此处用javascript实现)
(第一篇博文) 今天在一个交流群里见他们无聊,然后找到之前收藏的一些c语言题目放出去想让他们做,结果反倒是自己不会做,于是花了很多时间去想. 原题:张三说李四在说谎,李四说王五在说谎,王五说张三和李四 ...
- 学习java随笔第九篇:java异常处理
在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生 ...
- P2P之UDP穿透NAT原理
首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就 ...