[UOJ164]V
线段树真是好东西...
每个线段树节点维护四个标记:$a,b,maxa,maxb$,$(a,b)$表示对子树内的所有数执行$x'=\max(x+a,b)$,$maxa,maxb$是历史最大标记,初始时$a=ma=0,b=mb=-\infty$
首先是更新标记,假如有新标记$a',b',maxa',maxb'$要加到原有标记上,因为$x'=\max(\max(x+a,b)+a',b')=\max(x+a+a',\max(b+a',b'))$,所以我们用$a+ma'$更新$ma$,用$\max(b+ma',mb')$更新$mb$,用$\max(b+a',b')$更新$b$,用$\max(a+a',-\infty)$更新$a$
操作$1$就是$(x,0,x,0)$,操作$2$就是$(-x,0,-x,0)$,操作$3$就是$(-\infty,x,-\infty,x)$(因为这里的标记是$a=ma=-\infty$,所以刚才更新$a$要和$-\infty$取$\max$防止爆$\text{long long}$),两个询问直接$\text{pushdown}$下去即可
存历史最大标记而不是历史最大值是因为有可能一个标记还未被传下去用于更新实际数值就被另一个标记覆盖了,所以要存标记的历史最大值
#include<stdio.h> typedef long long ll; const ll inf=1000000000000000ll; ll max(ll a,ll b){return a>b?a:b;} struct seg{ ll a,b,ma,mb; seg(ll i=0,ll j=-inf,ll k=0,ll l=-inf){a=i;b=j;ma=k;mb=l;} void gao(seg t){ ma=max(ma,a+t.ma); mb=max(mb,max(b+t.ma,t.mb)); b=max(b+t.a,t.b); a=max(a+t.a,-inf); } }t[2000010]; void pushdown(int x){ t[x<<1].gao(t[x]); t[x<<1|1].gao(t[x]); t[x]=seg(); } void modify(int L,int R,seg p,int l,int r,int x){ if(L<=l&&r<=R)return t[x].gao(p); pushdown(x); int mid=(l+r)>>1; if(L<=mid)modify(L,R,p,l,mid,x<<1); if(mid<R)modify(L,R,p,mid+1,r,x<<1|1); } int query(int p,int l,int r,int x){ if(l==r)return x; pushdown(x); int mid=(l+r)>>1; if(p<=mid)return query(p,l,mid,x<<1); return query(p,mid+1,r,x<<1|1); } ll a[500010]; int main(){ int n,m,i,l,r,x; scanf("%d%d",&n,&m); for(i=1;i<=n;i++)scanf("%dll",a+i); while(m--){ scanf("%d%d",&i,&l); if(i<4)scanf("%d%d",&r,&x); if(i==1)modify(l,r,seg(x,0,x,0),1,n,1); if(i==2)modify(l,r,seg(-x,0,-x,0),1,n,1); if(i==3)modify(l,r,seg(-inf,x,-inf,x),1,n,1); if(i==4){ x=query(l,1,n,1); printf("%lld\n",max(a[l]+t[x].a,t[x].b)); } if(i==5){ x=query(l,1,n,1); printf("%lld\n",max(a[l]+t[x].ma,t[x].mb)); } } }
[UOJ164]V的更多相关文章
- uoj164. 【清华集训2015】V 统计
坑爹题面:http://uoj.ac/problem/164 正常题面: 对于一个序列支持下列5个操作: 1.区间加x 2.区间减x并与0取max 3.区间覆盖 4.单点查询 5.单点历史最大值查询 ...
- 「题解」「UOJ-164」「清华集训2015」V
目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...
- J a v a 的“多重继承”
接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...
- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...
- [Erlang 0118] Erlang 杂记 V
我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下. 做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...
- v$session中server为none与shared值解析
查询V$SESSION,你会看到SERVER可能会有DEDICATED| SHARED| PSEUDO| NONE 四种值,如果SERVER字段的值除了DEDICATED,还有NONE,则说明当前实例 ...
- 引用js或css后加?v= 版本号的用法
<span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version ...
- 操作系统中的P,V操作(转)
无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...
- 关于P,V操作理解的突破,关于并发设计与并行
今天又找了一篇博客研究P,V操作.. 发现..它有一个变量没有声明.. 我就换了篇博客..http://c.biancheng.net/cpp/html/2600.html 然后就看懂了.. 关键突破 ...
随机推荐
- 如何用PhotoShop制作网站的favicon.ico
所谓favicon,即Favorites Icon的缩写,顾名思义,便是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站.当然,这不仅仅是Favicon的全部,根据浏览器的不同 ...
- nc用法小记
By francis_hao Jun 30,2017 ncat:连接和重定向套接字 概要 ncat [OPTIONS...] [hostname] [port] 描述 ncat 是一个集 ...
- 怎么把linux的磁盘映射到windows上
步骤如下: 右击如下的computer: 然后选择:Map network drive... 然后在下图按图中所示操作: 最后成功如下图所示:
- 随机洗牌算法Knuth Shuffle和错排公式
Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...
- linux基础(2)
Linux基础题 作业一:1) 新建用户natasha,uid为1000,gid为555,备注信息为“master”useradd natashagroupmod -g 555 natashauser ...
- Bzoj1917 [Ctsc2010]星际旅行
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 185 Solved: 118 Description 公元3000年,地球联盟已经攻占了银河系内的N ...
- python基础代码(猜年龄、从最内层跳出多层循环、简单的购物车程序)
1.猜年龄 , 可以让用户最多猜三次! age = 55 i=0 while i<3: user_guess = int (input ("input your guess:" ...
- linux基础——磁盘分区和yum安装
第一部分 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1 ...
- 如何利用好chrome控制台这个神器好好调试javascript代码
上面的文章已经大致介绍了一下console对象具体有哪些方面以及基本的应用,下面简单介绍一下如何利用好chrome控制台这个神器好好调试javascript代码(这个才是我们真正能用到实处的地方) 1 ...
- 使用Tslib在触摸屏上显示汉字【转】
转自:http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html 终于到了在触摸屏上显示汉字了, ...