#斜率优化,二分#CF631E Product Sum
题目
有一个数列 \(a\),其权值为 \(\sum_{i=1}^ni*a_i\),
现在可以任意选择其中一个数字扔到任意位置,使权值和最大。
\(n\leq 2*10^5,|a_i|\leq 10^6\)
分析
不妨先将原数列的权值算一遍,那么其实只是让改变的权值尽量大。
设选择的数字为 \(a_i\),选择的位置为 \(j\)。
当 \(j<i\) 时,表示将这个数放在第 \(j\) 个位置,同时 \([j,i)\) 的数往后移。
改变的权值就是 \(s_{i-1}-a_i*i+a_i*j-s_{j-1},j\in [1,i)\)
令 \(j'=j-1,i'=i-1\) 也就是求 \(s_{i'}-a_{i'+1}*i'+a_{i'+1}*j'-s_{j'}\)
当 \(j>i\) 时,表示将这个数放在第 \(j\) 个位置,同时 \((i,j]\) 的数往前移。
改变的权值就是 \(s_i-a_i*i+a_i*j-s_j,j\in (i,n]\)
综上所述,转化为两个式子:
\]
以下式为例,若 \(\exists k>j,a_i*k-s_k\geq a_i*j-s_j\),即 \(\frac{s_k-s_j}{k-j}\leq a_i\) 时,将 \(j\) 弹出。
考虑到求的是最大值,那么维护一个上凸壳,理应是斜率单调递减,不过由于倒序实际上具体维护时是单调递增的。
因为 \(a_i\) 不具有单调性,所以在凸壳上面二分即可。
代码
#include <cstdio>
#include <cctype>
#define fz(j,i) (s[i]-s[j])
#define fm(j,i) (i-j)
using namespace std;
const int N=200011; typedef long long lll;
lll a[N],s[N],sum,ans; int q[N],n,head,tail;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
lll max(lll a,lll b){return a>b?a:b;}
int lower(lll x){
int l=head,r=tail;
while (l<r){
int mid=(l+r+1)>>1;
if (fz(q[mid-1],q[mid])<=x*fm(q[mid-1],q[mid])) l=mid;
else r=mid-1;
}
return q[l];
}
int upper(lll x){
int l=head,r=tail;
while (l<r){
int mid=(l+r)>>1;
if (fz(q[mid],q[mid+1])>=x*fm(q[mid],q[mid+1])) r=mid;
else l=mid+1;
}
return q[l];
}
int main(){
n=iut();
for (int i=1;i<=n;++i){
a[i]=iut(),s[i]=s[i-1]+a[i];
sum+=a[i]*i;
}
head=tail=1;
for (int i=1;i<n;++i){
int now=lower(a[i+1]); ans=max(ans,s[i]+(now-i)*a[i+1]-s[now]);
ans=max(ans,s[i]+(q[tail]-i)*a[i+1]-s[q[tail]]);
while (head<tail&&fz(q[tail-1],q[tail])*fm(q[tail],i)>=fz(q[tail],i)*fm(q[tail-1],q[tail])) --tail;
q[++tail]=i;
}
head=tail=1,q[1]=n;
for (int i=n-1;i;--i){
int now=upper(a[i]); ans=max(ans,s[i]+(now-i)*a[i]-s[now]);
while (head<tail&&fz(q[tail-1],q[tail])*fm(q[tail],i)<=fz(q[tail],i)*fm(q[tail-1],q[tail])) --tail;
q[++tail]=i;
}
return !printf("%lld",ans+sum);
}
#斜率优化,二分#CF631E Product Sum的更多相关文章
- BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...
- [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找
网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- BZOJ2726:任务安排(DP+斜率优化+二分)
机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...
- 小A与最大子段和 斜率优化 + 二分 + 细节
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)
Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...
- 洛谷P3648 [APIO2014]序列分割(斜率优化)
传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...
- Codeforces Round #344 (Div. 2) E. Product Sum 二分斜率优化DP
E. Product Sum Blake is the boss of Kris, however, this doesn't spoil their friendship. They often ...
- Codeforces 631E Product Sum 斜率优化
我们先把问题分成两部分, 一部分是把元素往前移, 另一部分是把元素往后移.对于一个 i 后的一个位置, 我们考虑前面哪个移到这里来最优. 我们设最优值为val, val = max(a[ j ] ...
随机推荐
- golang常用库包:redis操作库go-redis使用(01)-Redis数据类型简介和连接Redis的几种方式
第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis(本篇) https://www.cnblogs.com/jiujuan/p/1720716 ...
- 【Azure 应用服务】Azure Function 部署槽交换时,一不小心把预生产槽上的配置参数交换到生产槽上,引发生产错误
问题描述 部署Function代码先到预生产槽中,进行测试后通过交换方式,把预生产槽中的代码交换到生产槽上,因为在预生产槽中的设置参数值与生产槽有不同,但是在交换的时候,没有仔细检查.导致在交换的时候 ...
- 【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
问题描述 部署在App Service For Windows 中的网站使用 Java Spring Boot + 静态文件 (浏览器端使用Vue.js 与服务器端Java Spring Boot交互 ...
- spark 下java list 或者scala list 转DataFrame or DataSet 总结
一.JAVA list 转 DataFrame or DataSet case class CaseJava( var num: String, var id: String, var start_t ...
- 手把手教你蜂鸟e203协处理器的扩展
NICE协处理器 赛题要求: 对蜂鸟E203 RISC-V内核进行运算算子(譬如加解密算法.浮点运算.矢量运算等)的扩展,可通过NICE协处理器接口进行添加,也可直接实现RISC-V指令子集(譬如 ...
- 【夏令时】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
前言 缘由 用@JsonFormat(pattern = "yyyy-MM-dd")注解,出生日期竟然年轻了一天 艺术源于生活,bug源于开发. 起因是艰苦奋战一个月,测试及验收都 ...
- docker 安装 es-head 以及Content-Type header请求头错误解决
拉取es-head镜像,启动 docker pull mobz/elasticsearch-head:5 docker run -itd --name es-head -p 9100:9100 mob ...
- liunx 安装 python 虚拟环境, 各种方法,
liunx 安装 python 虚拟环境,主要是要解决工作中需要用到python3.6,但是系统的2.7又不能动,安装系统组件时避免造成冲突.低版本的python安装django uwsgi 等都用 ...
- vxe table columns 要用data里的值,用computed的值会导致排序部分不好用。
vxe table columns 要用data里的值,用computed的值会导致排序部分不好用.
- Istio中的核心资源及定义
Istio 的核心资源主要包括以下几种: 1. Gateway 用于建模边缘网关,可以为进入或离开网格的流量提供专用的入口和出口点.Gateway 定义了在网格边缘运行的负载均衡器,用于接收传入或传出 ...