线段树真是好东西...

每个线段树节点维护四个标记:$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的更多相关文章

  1. uoj164. 【清华集训2015】V 统计

    坑爹题面:http://uoj.ac/problem/164 正常题面: 对于一个序列支持下列5个操作: 1.区间加x 2.区间减x并与0取max 3.区间覆盖 4.单点查询 5.单点历史最大值查询 ...

  2. 「题解」「UOJ-164」「清华集训2015」V

    目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...

  3. J a v a 的“多重继承”

    接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...

  4. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  5. [Erlang 0118] Erlang 杂记 V

       我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下.    做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...

  6. v$session中server为none与shared值解析

    查询V$SESSION,你会看到SERVER可能会有DEDICATED| SHARED| PSEUDO| NONE 四种值,如果SERVER字段的值除了DEDICATED,还有NONE,则说明当前实例 ...

  7. 引用js或css后加?v= 版本号的用法

    <span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version ...

  8. 操作系统中的P,V操作(转)

    无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...

  9. 关于P,V操作理解的突破,关于并发设计与并行

    今天又找了一篇博客研究P,V操作.. 发现..它有一个变量没有声明.. 我就换了篇博客..http://c.biancheng.net/cpp/html/2600.html 然后就看懂了.. 关键突破 ...

随机推荐

  1. YUI Compressor是如何压缩JS代码的?

    YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor 包 ...

  2. sqlplus 几个命令:

    sqlplus 几个命令: 在sys,system,sysman,scott四个用户权限中,scott用户最低. 其权限依次从高到低. cmd进入sqlplus sqlplus 登录命令: 登录sys ...

  3. AQS同步组件及ReentrantLock和synchronized的区别

    AQS同步组件 CountDownLatch(只有一个线程对他进行操作): 主线程必须在启动其它线程后立即调用await()方法.这样主线程的操作就会在这个方法上阻塞,直到其它线程完成各自的任务. S ...

  4. KMP算法_模板_C++

    这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...

  5. arcgis for flex 学习笔记(一)

    初步认识 地图由图层.要素.样式等组成.地图上有N个图层,图层上有N个要素,每个要素可以存放点.线.面等,每个要素可以设置样式,如果显示图片.或文字均可以先创建一个mxml组件,然后设置到要素上. 面 ...

  6. bzoj 3190 维护栈

    我们可以将每一辆赛车看成一条直线,斜率为速度,纵截距为初始位置,那么问题就转化为求这n条直线处于最上面的直线.最上面是指在坐标系中,假设从x轴向下看,能看到的直线,只露一个点也算能看见.那么就类似水平 ...

  7. django返回二进制图片

    @login_required def down_img(request, path): content = Storage().download(path) from django.http imp ...

  8. kernel 中 sscanf和sprintf()函数使用说明【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/8480695 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于s ...

  9. JMeter之定时器的作用域

    定时器的作用域 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执行 ...

  10. k8s的Rolling Update(滚动更新应用)

    滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用: 初始 ...