P4756-Added Sequence【斜率优化】
正题
题目链接:https://www.luogu.com.cn/problem/P4756
题目大意
给出序列\(a\),设\(f(l,r)=|\sum_{i=l}^ra_i|\)。
\(m\)次询问若序列\(a\)全部加上某个数\(x\),求最大的\(f(l,r)\)。
\(1\leq n,m\leq 2\times 10^5\),强制在线(或许)
解题思路
求一次前缀和的话设为\(s_i\),那么\(f(l,r)=|s_r-s_l|\)。其实拆开绝对值不难发现这样就去掉了\(l,r\)的限制,答案就是\(max\{s_r\}-min\{s_l\}\)了。
然后集体加上某个数\(x\)的话,原来的\(s_i\)就变为了\(s_i+i\times x\)了。
然后就是给出\(x\)求最大和最小的\(s_i+i\times x\)。经典的斜率优化把戏。
维护一个上凸壳,一个下凸壳,然后在上面二分就好了。
时间复杂度\(O(n+m\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10;
ll n,m,top,toq,f[N],s[N],t[N];
ll calc(ll x,ll i)
{return x*i+f[i];}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&f[i]);f[i]+=f[i-1];
while(top&&(f[i]-f[s[top]])*(s[top]-s[top-1])>=(f[s[top]]-f[s[top-1]])*(i-s[top]))top--;s[++top]=i;
while(toq&&(f[i]-f[t[toq]])*(t[toq]-t[toq-1])<=(f[t[toq]]-f[t[toq-1]])*(i-t[toq]))toq--;t[++toq]=i;
}
ll pre=0,x;
while(m--){
scanf("%lld",&x);x=(x+pre)%(4*n+1)-2*n;
ll l=0,r=top-1;pre=0;
while(l<=r){
ll mid=(l+r)>>1;
if(calc(x,s[mid])>calc(x,s[mid+1]))r=mid-1;
else l=mid+1;
}
pre+=calc(x,s[l]);
l=0;r=toq-1;
while(l<=r){
ll mid=(l+r)>>1;
if(calc(x,t[mid])<calc(x,t[mid+1]))r=mid-1;
else l=mid+1;
}
pre-=calc(x,t[l]);
printf("%lld\n",pre);
}
return 0;
}
P4756-Added Sequence【斜率优化】的更多相关文章
- [POJ1180&POJ3709]Batch Scheduling&K-Anonymous Sequence 斜率优化DP
POJ1180 Batch Scheduling Description There is a sequence of N jobs to be processed on one machine. T ...
- POJ 3709 K-Anonymous Sequence - 斜率优化dp
描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j + sum_i - su ...
- POJ3709 K-Anonymous Sequence 斜率优化DP
POJ3709 题意很简单 给n个递增整数(n<=500000)和一种操作(选择任意个数 使他们减少整数值) 使得对于所有的整数 在数列中 有k个相等的数 O(n^2)的DP方程很容易得出 如下 ...
- luogu P4756 Added Sequence(凸包+思维)
一眼望去不会. 考虑问题中的\(f(i,j)=|\sum_{p=i}^{j}a_p |\)的实际意义. 其实就是前缀和相减的绝对值. \(f(i,j)=|\ sum[j]-sum[i-1]\ |\ ...
- UOJ#104. 【APIO2014】Split the sequence 动态规划 斜率优化
原文链接www.cnblogs.com/zhouzhendong/p/UOJ104.html 题解 首先证明一个结论:对于一种分割方案,分割的顺序不影响最终结果. 证明:对于树 a[x] 和 a[y] ...
- POJ 3709 K-Anonymous Sequence(斜率优化DP)
[题目链接] http://poj.org/problem?id=3709 [题目大意] 给出一个长度为n个非严格单调递增数列,每次操作可以使得其中任意一项减一, 问现在使得数列中每项数相同的数的数量 ...
- poj3709 K-Anonymous Sequence[贪心+斜率优化dp]
地址 n个数,可进行把一个数减小的操作,代价为减小的值.现求使数列任意一个数都存在至少k-1个数和他相同,问操作的最小代价. 可以先考虑最小的数,由于只能减,所以必须得至少k-1个数减为最小数,贪心策 ...
- 【DP】斜率优化
斜率优化 入门题:PKU3709 很多人貌似都是做这道题来K斜率优化的,所以看了资料以后还是开始入手吧. 然而还是得跪求大神的程序啊 ORZ ORZ…… 其实理解斜率优化就是会列斜率不等式,还要理解剔 ...
- HDU 2993 MAX Average Problem dp斜率优化
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- Centos7上安装最新的nodejs
下载nodejs包 安装wget yum install -y wget 下载nodejs到/usr/local/nodejs/下 https://cdn.npm.taobao.org/dist/no ...
- .NET Core:处理全局异常
一.前言 在程序设计中,我们会遇到各种各样的异常问题,一个好的异常处理解决方案能够帮助开发者快速的定位问题,也能够给用户更好的用户体验.那么我们在AspNetCore中该如何捕获和处理异常呢?我们以一 ...
- VS 添加自定义--代码块 实现一秒创建方法
创建一个方法 你是不是不可避免需要敲以下至少6行代码 现在教你一个方法 实现一秒创建完整方法 首先按照代码块规则创建代码块文件 代码块意义,是什么? 请参考: https://docs.microso ...
- Vue 插槽 slot的简单实用
- WPF学习笔记二 依赖属性实现原理及性能分析
在这里讨论依赖属性实现原理,目的只是学习WPF是怎么设计依赖属性的,同时更好的使用依赖属性. 首先我们来思考一个简单的问题:我们希望能验证属性的值是否有效,属性变更时进行自己的处理.回顾一下.net的 ...
- Django常用 命令
Django常用 命令: 安装: pip install django 指定版本 pip3 install django==2.0 新建项目: django-admin.py startproject ...
- SpringBoot快速入门(必知必会)
是什么?能做什么 SpringBoot必知必会 是什么?能做什么 SpringBoot是一个快速开发脚手架 快速创建独立的.生产级的基于Spring的应用程序 SpringBoot必知必会 快速创建应 ...
- JFrame显示刷新
1 import java.awt.BorderLayout; 2 import java.awt.Font; 3 import java.awt.event.ActionEvent; 4 impor ...
- ES6对象扩展——扩展运算符
1.复制对象:使用扩展运算符复制对象时是浅拷贝 //复制对象:使用扩展运算符复制对象时是浅拷贝 const obj1 = { a:1, b:2, d:{ aa:1, bb:2 } } const ob ...
- Oracle存储过程锁表
存储过程: 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CRM_LASTCHGINFO_DAY' ...