线段树真是好东西...

每个线段树节点维护四个标记:$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学习--通过注解配置 Bean (一)

    在 classpath 中扫描组件: 组件扫描(component scanning): Spring 能够从 classpath 下自动扫描 , 侦测和实例化具有特定注解的组件. 特定组件包括: @ ...

  2. IOS 学习资料整理{非常有用,强烈推荐}

    绝地地的资源博客:我是雷锋不用谢~~啦啦啦 https://blog.csdn.net/kunga0814/article/details/82117090

  3. Android 实现对图片 Exif 的修改(Android 自带的方法)

    很多时候我们都要对我们的图片信息进行一些处理,比如向图片中写入经纬度,拍摄时间,设备信息,作者等等. 这个时候我们就要对我们的图片Exif进行写入信息的操作,当然,我们想知道图片的Exif信息,也可以 ...

  4. ByteUtil 工具类

    ByteUtil 工具类 import java.io.FileOutputStream; import java.io.OutputStream; import java.nio.charset.C ...

  5. 【洛谷 P1666】 前缀单词 (Trie)

    题目链接 考试时暴搜50分...其实看到"单词","前缀"这种字眼时就要想到\(Trie\)的,哎,我太蒻了. 以一个虚点为根,建一棵\(Trie\),然后\( ...

  6. bzoj 2705 数学 欧拉函数

    首先因为N很大,我们几乎不能筛任何东西 那么考虑设s(p)为 gcd(i,n)=p 的个数,显然p|n的时候才有意义 因为i与n的gcd肯定是n的因数,所以那么可得ans=Σ(p*s(p)) 那么对于 ...

  7. python3 面向过程编程思想,函数综合应用

    应用:grep -rl 'root' /etc 实现过滤文件的功能 import os def init(func): def wrapper(*args,**kwargs): g=func(*arg ...

  8. TASK_KILLABLE:Linux 中的新进程状态【转】

    转自:https://www.ibm.com/developerworks/cn/linux/l-task-killable/index.html 新的睡眠状态允许 TASK_UNINTERRUPTI ...

  9. python--requests_html

    这个模块从名字上也能看出来,是专门用来解析html的,这个和requests的作者是同一人,非常牛逼的一位大佬. 大致读了一下源码,总共一个py文件(但是引用了其他的模块),加上注释总共才700多行, ...

  10. go语言中的json

    结构体类型转化为json格式 package main import ( "encoding/json" "fmt" ) //如果要转化成json格式,那么成员 ...