[CF935F]Fafa and Array
法法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的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- JavaScript Array对象
介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- 关于面试题 Array.indexof() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
- javascript之活灵活现的Array
前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...
- 5.2 Array类型的方法汇总
所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...
- OpenGL ES: Array Texture初体验
[TOC] Array Texture这个东西的意思是,一个纹理对象,可以存储不止一张图片信息,就是说是是一个数组,每个元素都是一张图片.这样免了频繁地去切换当前需要bind的纹理,而且可以节省系统资 ...
- Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
随机推荐
- Install Rancher server
1.pre-requirement: sudo nmtui # sudo hostnamectl set-hostname <hostname> $ sudo hostnamectl se ...
- Awk basic and practice
定义:Awk是一种程序语言,用来处理数据和产生报告.数据可来自标准输入,文件,管道输出. 格式:#awk '/pattern/ {action}' filename 术语:pattern, 样式是由正 ...
- Python爬虫学习笔记之抓取猫眼的排行榜
代码: import json import requests from requests.exceptions import RequestException import re import ti ...
- iOS 快速框架搭建项目
项目目录 Pod第三方 gitHub地址 https://github.com/henusjj/Basic-project-framework
- 用eval转化对象
var str = '{"name": "tom","age": 12,"sex": "man"}' ...
- 图论:费用流-SPFA+EK
利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这 ...
- bzoj3382 [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3382 [题解] 套路题. 首先我们会发现曼哈顿距离不好处理,难道要写kdtree??? (k ...
- bzoj 5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- [BZOJ2502]清理雪道解题报告|带下界的最小流
滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...