题目

有一个数列 \(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]\)

综上所述,转化为两个式子:

\[\begin{align}\max_{0\leq j<i<n} s_i-a_{i+1}*i+a_{i+1}*j-s_j\\\max_{1\leq i<j\leq n} s_i-a_i*i+a_i*j-s_j\end{align}
\]

以下式为例,若 \(\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的更多相关文章

  1. BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分

    BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...

  2. [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找

    网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...

  3. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  4. BZOJ2726:任务安排(DP+斜率优化+二分)

    机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...

  5. 小A与最大子段和 斜率优化 + 二分 + 细节

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  6. 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 ...

  7. 洛谷P3648 [APIO2014]序列分割(斜率优化)

    传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...

  8. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

  9. 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 ...

  10. Codeforces 631E Product Sum 斜率优化

    我们先把问题分成两部分, 一部分是把元素往前移, 另一部分是把元素往后移.对于一个 i 后的一个位置, 我们考虑前面哪个移到这里来最优. 我们设最优值为val,   val = max(a[ j ] ...

随机推荐

  1. Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行

    前言: 之前有网友说 Mvc系列的教程对新手不友好,因此补充新手入门系列教程. 在开始使用 Taurus.Mvc 进行 Web应用开发之前,建议可以观摩一下之前的文章:WebAPI 系列教程 因为两者 ...

  2. 在vue项目中使用scss语法的准备步骤

    在vue项目中使用scss语法的准备步骤 个人总结: 在项目根目录cmd控制台中使用以下命令行,安装vue项目中使用scss的相关依赖; 在["项目根目录/build/webpack.bas ...

  3. python中的泛型使用TypeVar

    引入为什么需要TypeVar PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分.通过精巧的元编程技术,让类 支持[]运算不成问题.但是方括号内的T变量必须在某处定义,否则要 ...

  4. ASP.NET XML序列化

    整理一下ASP.NET里面如何序列化实体为XML,获取解析XML内容为实体. 第一步要添加程序集引用,项目-->引用-->鼠标右键-->添加引用-->选择程序集-->Sy ...

  5. 05、etcd 读请求执行流程

    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 1.etcd读请求概览 etcd是典型的读多写少存储,在我们实际业务场景中,读一般占据2/3以上的请求.一个读 请求从client通过R ...

  6. Excel去除表格密码保护

    表格受密码保护时,我们修改数据Excel弹出"您试图更改的单元格或图表受保护,因而是只读的.若要修改受保护单元格或图表,请先使用'撤消工作表保护'命令(在'审阅'选项卡的'更改'组中)来取消 ...

  7. 发现这个ip有bt下载,所以改路由,让其访问到一个不存在的ip上 route add

    管理员权限cmd 发现这个ip有bt下载,所以改路由,让其访问到一个不存在的ip上 route add -p 195.154.181.225 mask 255.255.255.255 127.0.0. ...

  8. Leetcode 1161 最大层内元素和

    一.题目 给你一个二叉树的根节点 root.设根节点位于二叉树的第1层,而根节点的子节点位于第2层,依此类推. 请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个. 示 ...

  9. ble无线智能工牌解决方案技术解析

    场景需求  在无线智能工牌领域,团队做了几个实际场景的解决方案之后,积累了一些行业需求经验和技术经验.这里做一个总结,算是一种沉淀吧.场景一:居家养老,医护和护工人员定期上门服务,根据工作时长来发工资 ...

  10. [置顶] spring巧用继承解决bean的id相同的问题

    先感叹一下:最近的项目真的很奇葩!!! 需求是这样的:我们的项目中引用了两个jar包,这两个jar包是其他项目组提供的,不能修改! 奇葩的是:这两个jar中都需要引用方提供一个相同id的bean,而b ...