题目链接: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. 企业服务的3种模式:On-Premise、SaaS、Mixed,该选哪种?--创业邦

    B轮融资二三事 我们从9月份开始启动B轮融资,与这些颇具洞察力的投资人聊天,是非常有挑战的事.他们的很多观点充满智慧,能帮你突破思考局限,受益良多.当然,整个过程虽然有趣但也不轻松,毕竟你的目的是完成 ...

  2. [Bootstrap] install Bootstrap framework in window 7 by npm

    Install with npm You can also install Bootstrap using npm: $ npm install bootstrap require('bootstra ...

  3. eclipse 安装Subversion1.82(SVN)插件

    Eclipse下SVN插件的安装,可以选择在线安装和离线安装两种方式: 2.(可选①)使用本地安装包安装插件 --填写插件名(可随意取名) --插件来源地址(①安装包,②使用网址) →Archie→选 ...

  4. spring全局变量引起的并发问题

    先看下面小段代码,一个controller,一个service. controller.java代码:    ........    @Autowired     private XXXService ...

  5. Linux配置Nginx,MySql,php-fpm开机启动的方法

    一. Nginx 开机启动 1.在/etc/init.d/目录下创建脚本 vim /etc/init.d/nginx 2.编写脚本内容 (将以下复制进去相应改动安装路径) 1 2 3 4 5 6 7 ...

  6. [shell]用shell脚本将本地文件夹与ftp上的文件夹同步

    需求说明 最近在AIX上做开发,开发机器在office网段,测试机器在lab网段,不能互相通讯,只能通过特定的ftp来传文件. 每次上传的机器都要做:登录ftp,进入我的目录,上传:下载的机器都要做: ...

  7. 限制ip ssh远程登录

    有时候为了服务器的安全考虑,我们可以在服务器上做限制,禁止其他ip地址连接服务器. 方法一:修改ssh配置文件 其实做这个操作很简单,只需要改/etc/ssh/sshd_config配置文件,再最后一 ...

  8. 南京网络赛G-Lpl and Energy【线段树】

    During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...

  9. ubuntu16安装使用chrome

    1. sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ 将下载源加入到系统的源 ...

  10. 详解javascript实现自定义事件

    这篇文章主要为大家介绍了javascript实现自定义事件的方法,自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,javascript如何实现自定义事件,需要了解的朋友可以参考下 我 ...