UOJ #164 【清华集训2015】 V
题目链接:V
这道题由于是单点询问,所以异常好写。
注意到每种修改操作都可以用一个标记\((a,b)\)表示。标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\)
同时这种标记也是支持合并的。有\((a,b)+(c,d)=(a+c,\max\{b+c,d\})\)
用上这种标记的话,\(1\)操作就是\((x,0)\),\(2\)操作就是\((-x,0)\),\(3\)操作就是\((-inf,x)\)。
要查询单点值的话只要把所有标记都下放了就好了。
这种标记也支持取\(\max\)。即,\(\max\{(a,b),(c,d)\}=(\max\{a,c\},\max\{b,d\})\)。本质上就是一个分段函数取\(\max\)的过程。
所以最后一问再维护一个历史最大值这道题就做完了。注意下传标记时先传历史标记。
还有一个要注意的地方:标记\((a,b)\)里的\(a\)实际上是\(\max\{a,-inf\}\)。注意修改的时候和\(-inf\)取个\(max\),不然很容易就爆掉了。
下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define max(a,b) (a>b?a:b)
#define maxn 500010
#define INF (1LL<<60) using namespace std;
typedef long long llg; int n,m,L,R;
llg na[maxn<<2],nb[maxn<<2];
llg pa[maxn<<2],pb[maxn<<2],za,zb; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void pushdown(int u){
for(int i=0,v;v=u<<1|i,i<2;i++){
pa[v]=max(pa[v],pa[u]+na[v]);
pb[v]=max(pb[v],max(pb[u],nb[v]+pa[u]));
na[v]=max(na[v]+na[u],-INF);
nb[v]=max(nb[v]+na[u],nb[u]);
}
na[u]=nb[u]=pa[u]=pb[u]=0;
} void build(int u,int l,int r){
int lc=u<<1,lv=u<<1|1,mid=(l+r)>>1;
if(l==r) na[u]=pa[u]=getint();
else build(lc,l,mid),build(lv,mid+1,r);
} void add(int u,int l,int r){
int lc=u<<1,lv=u<<1|1,mid=(l+r)>>1;
if(L<=l && r<=R){
na[u]=max(na[u]+za,-INF);
nb[u]=max(nb[u]+za,zb);
pa[u]=max(pa[u],na[u]);
pb[u]=max(pb[u],nb[u]);
return;
}
pushdown(u);
if(L<=mid) add(lc,l,mid);
if(R>mid) add(lv,mid+1,r);
} void query(bool w){
int u=1,l=1,r=n,mid;
while(l!=r){
mid=(l+r)>>1;
pushdown(u); u<<=1;
if(L<=mid) r=mid;
else u|=1,l=mid+1;
}
za=w?na[u]:pa[u];
zb=w?nb[u]:pb[u];
} int main(){
File("a");
n=getint(),m=getint();
build(1,1,n);
while(m--){
int ty=getint(),x;
if(ty<=3){
L=getint(),R=getint();x=getint();
if(ty==1) za=x,zb=0;
if(ty==2) za=-x,zb=0;
if(ty==3) za=-INF,zb=x;
add(1,1,n);
}
else{
L=R=getint(); query(ty==4);
printf("%lld\n",max(za,zb));
}
}
return 0;
}
UOJ #164 【清华集训2015】 V的更多相关文章
- UOJ #164 [清华集训2015]V (线段树)
题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...
- 清华集训2015 V
#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...
- 「清华集训2015」V
「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- UOJ #164. 【清华集训2015】V | 线段树
题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...
- UOJ#164:【清华集训2015】V
浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...
- 2018.07.28 uoj#164. 【清华集训2015】V(线段树)
传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...
- @uoj - 164@ 【清华集训2015】V
目录 @description@ @solution@ @accepted code@ @details@ @description@ Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化 ...
随机推荐
- 【BZOJ5100】[POI2018]Plan metra 构造
[BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...
- 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树
[BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号 ...
- ajax跨域终极解决办法!
在使用 ajax 的时候,往往需要通过 ajax 跨域请求一些? 但是 XMLHTTPRequest 是不支持跨域的,所以产生了 JSONP 这个东西来解决跨域,当然解决跨域的方式有很多种.... 第 ...
- 310实验室(七)OptimizationTemplateLibrary
利用泛型编程思想,C++模板. 首先定义变量或者重新typedef variables: 模板中的变量:_TRandom.double _TReal._TProblem::TDecision _TD ...
- AWR之-enq TX - row lock contention的性能故障-转
1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高: Snap Id Snap Time Sessio ...
- Python开发【模块】:BeautifulSoup
BeautifulSoup BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XM ...
- 对django框架架构和request/response处理流程的分析
一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. 中间件,就是处理HTT ...
- spring boot由浅入深(二)spring boot基本命令及操作
一 spring常见注解 @RestController和@RequestMapping说明: @RestController.这被称为一个构造型(stereotype)注解.它为阅读代码的人们提供建 ...
- 将expression转化为数据类型int时发生算术溢出错误
在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...
- mysql源码编译安装
首先去官网http://dev.mysql.com/downloads/mysql/ 下载mysql源码.我下的是5.7.10 源码选择的是 Generic Linux (Architecture I ...