法法round(雾

题意:给一个序列$a_{1\cdots n}$,定义$\begin{align*}f=\sum\limits_{i=1}^{n-1}\left|a_i-a_{i+1}\right|\end{align*}$,修改是区间加,询问$(l,r,x)$表示把某个$a_i(i\in[l,r])$加上$x$后最大的$f$是多少

先考虑把某个$a_i$加上$x$后对$f$的影响,不失一般性,我们假设$a_{i-1}\leq a_{i+1}$,那么对$a_i$的大小分类讨论,有三种情况

①$a_i\leq a_{i-1},a_i\leq a_{i+1}$,我们不希望找到这样的位置,因为$f$有可能变小,实际上当$l\neq r$时$a_{l\cdots r}$不会全是这种情况(所有$a_i$都比它两边的元素小,矛盾),所以直接忽略即可(当$l=r$时还是要特殊处理的)

②$a_{i-1}\leq a_i\leq a_{i+1}$,$f$可能变大,变化量为$2(x+a_i-a_{i+1})$

③$a_i\geq a_{i+1},a_i\geq a_{i-1}$,$f$一定会变大,变化量为$2x$

所以我们先把原序列差分:$d_i=a_i-a_{i-1}$,然后在线段树的下标为$i$的位置存$\min(d_i,0)+\min(-d_{i+1},0)$,每次查询$[l,r]$的最大值$mx$,那么$\max(0,2(x+mx))$就是$f$的增量

取$\min$对应着③,如果没有③,我们找到的是最小的$|a_i-\max(a_{i-1},a_{i+1})|$,这使得$f$增量最大,最后还要和$0$取$\max$是因为$f$可能不变(即这个区间任何一个数加上$x$都不会变成③)

因为做了差分,所以区间修改就变成单点修改了,修改$d_l,d_{r+1}$和线段树中的$l-1,l,r,r+1$即可

#include<stdio.h>
typedef long long ll;
const ll inf=9223372036854775807ll;
ll max(ll a,ll b){return a>b?a:b;}
ll min(ll a,ll b){return a<b?a:b;}
ll abs(ll x){return x>0?x:-x;}
ll d[300010],mx[1200010];
int M;
ll num(int i){
	return min(d[i],0)+min(-d[i+1],0);
}
void pushup(int x){mx[x]=max(mx[x<<1],mx[x<<1|1]);}
ll query(int s,int t){
	ll res=-inf;
	for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1)res=max(res,mx[s^1]);
		if(t&1)res=max(res,mx[t^1]);
	}
	return res;
}
void modify(int x){
	mx[x+M]=num(x);
	for(x=(x+M)>>1;x;x>>=1)pushup(x);
}
int main(){
	int n,m,i,op,l,r,x;
	ll sum;
	scanf("%d",&n);
	for(M=1;M<n;M<<=1);
	for(i=1;i<=n;i++)scanf("%I64d",d+i);
	for(i=n;i>0;i--)d[i]-=d[i-1];
	d[1]=0;
	sum=0;
	for(i=2;i<=n;i++)sum+=abs(d[i]);
	for(i=M;i<M<<1;i++)mx[i]=-inf;
	for(i=1;i<=n;i++)mx[i+M]=num(i);
	for(i=M-1;i>0;i--)pushup(i);
	scanf("%d",&m);
	while(m--){
		scanf("%d%d%d%d",&op,&l,&r,&x);
		if(op==1){
			if(l==r)
				printf("%I64d\n",sum-abs(d[l])+abs(d[l]+x)-abs(d[l+1])+abs(d[l+1]-x));
			else
				printf("%I64d\n",sum+max(0,2*(x+query(l,r))));
		}else{
			if(l>1)sum-=abs(d[l]);
			d[l]+=x;
			if(l>1)sum+=abs(d[l]);
			modify(l);
			if(l>1)modify(l-1);
			if(r<n){
				sum-=abs(d[r+1]);
				d[r+1]-=x;
				sum+=abs(d[r+1]);
				modify(r+1);
				modify(r);
			}
		}
	}
}

[CF935F]Fafa and Array的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  3. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  6. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

  7. 5.2 Array类型的方法汇总

    所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...

  8. OpenGL ES: Array Texture初体验

    [TOC] Array Texture这个东西的意思是,一个纹理对象,可以存储不止一张图片信息,就是说是是一个数组,每个元素都是一张图片.这样免了频繁地去切换当前需要bind的纹理,而且可以节省系统资 ...

  9. Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

随机推荐

  1. Active Directory Domain Services in Windows Server 2016/2012

    Applies To: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012 You will find links to ...

  2. Spring学习-- AOP入门动态代理

    AOP 的拦截功能是由 java 中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常 ...

  3. Java并发(8)- 读写锁中的性能之王:StampedLock

    在上一篇<你真的懂ReentrantReadWriteLock吗?>中我给大家留了一个引子,一个更高效同时可以避免写饥饿的读写锁---StampedLock.StampedLock实现了不 ...

  4. 【BZOJ4766】文艺计算姬 [暴力]

    文艺计算姬 Time Limit: 1 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description "奋战三星期,造台计算机 ...

  5. node导入导出的问题

    node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出去.要使用外界的变量,也必须使用导入的方式导入进来. import 变量名 from '文件地址'//css可以直接导入 ...

  6. wiki 2490 导弹拦截塔

    2013-09-23 21:16 二分答案+匈牙利判断 对于每一个时间,我们重新建一张二分图,由于每个塔可能打多次,所以要拆点, 对于每个拆的点的可行飞行距离为(mid-t1)-(ll-1)*(t1+ ...

  7. 转:java读取配置文件的几种方法

    转自: http://www.iteye.com/topic/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小 ...

  8. [Leetcode Week8]Triangle

    Triangle 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/triangle/description/ Description Given a t ...

  9. JAVA -- JDK JRE JAR

    转载:http://blog.csdn.net/wym19830218/article/details/5399401 JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C: ...

  10. android 调试 native 程序的方法

    一.背景 首先说需求,这个需求非常常见,就是android上需要的一个功能,linux已经有开源代码而且非常稳定,希望能直接porting过去使用,这个程序是pure c 的代码,也就是说,跟andr ...