题目链接: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的更多相关文章

  1. UOJ #164 [清华集训2015]V (线段树)

    题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...

  2. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  3. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

  4. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

  5. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  6. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  7. UOJ#164:【清华集训2015】V

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...

  8. 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

    传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...

  9. @uoj - 164@ 【清华集训2015】V

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化 ...

随机推荐

  1. Video如何不自动全屏播放?

    知乎:微信内置浏览器 如何小窗不全屏播放视频? 目前在微信中只能全屏播放,只有加入腾讯白名单的视频才能小屏播放. 知乎上讨论的解决方案尚未测试,太麻烦了.

  2. Egret3D初步笔记二 (Unity导出场景使用)

    一 Scene 根据上一节的继续.在导入unity4.7.1_Egret3D_Dll.unitypackage后. 在Unity中双击打开Assets/Egret3D/Example下的Example ...

  3. 把 Activity 改成 ListActivity继续使用 setContentView

    ListActivity has a default layout that consists of a single, full-screen list in the center of the s ...

  4. PHP中文字数限制:中文字符串截取(mb_substr)

    一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...

  5. (转)梯度下降法及其Python实现

    梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前 ...

  6. zabbix_server部署,启动,及端口未监听问题

    安装 下载地址:wget https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.2.6/zabbix-3 ...

  7. Process Monitor分析某个应用行为

    1.打开Process Mointor 2.点击filter-->filter   在弹出的对话框中Architecture 下拉框,选择Process Name 填写要分析的应用程序名字. 点 ...

  8. No module named pip.req

    https://stackoverflow.com/questions/25192794/no-module-named-pip-req#

  9. Linux java Tomcat 项目中 new Date 获取时间 8小时 时差

    转载自: https://blog.csdn.net/liqinghuiyx/article/details/53333284 起因:在本地开发的WEB项目部署到Linux 下后,存入数据库的时间少了 ...

  10. Miller-Rabin素数测试算法(POJ1811Prime Test)

    题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...