线段树真是好东西...

每个线段树节点维护四个标记:$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. Spring源码解析-AutowiredAnnotationBeanPostProcessor

    1.实现了BeanPostProcessor接口,可先看这个接口 ApplicationContext可以在自动检测BeanPostProcessor bean,在它创建完后可以创建任何的bean. ...

  2. 自定义orderBy字母函数

    orderedUsers: function () { var arr = this.users; for (var i = 0; i < arr.length - 1; i++) { for ...

  3. html中音频和视频

    HTML5音频中的新元素标签 src:音频文件路径. autobuffer:设置是否在页面加载时自动缓冲音频. autoplay:设置音频是否自动播放. loop:设置音频是否要循环播放. contr ...

  4. 使用bcrypt进行加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  5. [POJ1595]欧拉线性筛(虽然这道题不需要...)

    欧拉线性筛. 对于它的复杂度的计算大概思考了很久. procedure build_prime; var i,j:longint; begin fillchar(vis,sizeof(vis),tru ...

  6. [BZOJ2190&BZOJ2705]欧拉函数应用两例

    欧拉函数phi[n]是表示1~n中与n互质的数个数. 可以用公式phi[n]=n*(1-1/p1)*(1-1/p2)*(1-1/p3)...*(1-1/pk)来表示.(p为n的质因子) 求phi[p] ...

  7. 在Unity(C#)下实现Lazy Theta*寻路

    在上篇文章中我们介绍了Lazy Theta*.本篇中我会演示一下我实现的Lazy Theta*. 先上代码 //在一个点被expand时是否调用DebugOnExpanded事件,用于debug查看e ...

  8. bzoj 1067 特判

    这道题的大题思路就是模拟 假设给定的年份是x,y,首先分为4个大的情况,分别是 x的信息已知,y的信息已知 x的信息已知,y的信息未知 x的信息未知,y的情况已知 x的信息未知,y的情况未知 然后对于 ...

  9. 人脸识别 - 环境搭建(Ubuntu 16.04)

    安装人脸识别开源库(face_recognition) pip3 install face_recognition 注意:pip3 尝试编译 dlib 依赖时很可能会报错,参考:https://www ...

  10. Mac-装机

    不过大家可别被「命令行」三个字吓到,其实你只需按步骤来,复制粘贴命令即可快速完成,事实上是很简单的. 一.准备工作: 准备一个 8GB 或以上容量的 U 盘,确保里面的数据已经妥善备份好(该过程会抹掉 ...