Codeforces Round #344 (Div. 2) E. Product Sum 维护凸壳
E. Product Sum
题目连接:
http://www.codeforces.com/contest/631/problem/E
Description
Blake is the boss of Kris, however, this doesn't spoil their friendship. They often gather at the bar to talk about intriguing problems about maximising some values. This time the problem is really special.
You are given an array a of length n. The characteristic of this array is the value — the sum of the products of the values ai by i. One may perform the following operation exactly once: pick some element of the array and move to any position. In particular, it's allowed to move the element to the beginning or to the end of the array. Also, it's allowed to put it back to the initial position. The goal is to get the array with the maximum possible value of characteristic.
Input
The first line of the input contains a single integer n (2 ≤ n ≤ 200 000) — the size of the array a.
The second line contains n integers ai (1 ≤ i ≤ n, |ai| ≤ 1 000 000) — the elements of the array a.
Output
Print a single integer — the maximum possible value of characteristic of a that can be obtained by performing no more than one move.
Sample Input
4
4 3 2 5
Sample Output
39
Hint
题意
给你n个数,每个数是a[i]
然后所有数的答案就是sigma(i*a[i])
现在你可以随便交换两个数的位置
问你最后最大的答案是多少
题解:
考虑这个数和后面的数交换,那么增加的值是a[l]*(r-l)-(a[l+1]+...+a[r])
和前面的交换的话,a[r]*(l-r)+(a[l]+...+a[r-1])
然后我们分开考虑,先考虑和前面交换的
可以化简为(a[r]*l-sum[l-1])+(sum[r-1]-a[r]*r),显然我们直接暴力枚举r,然后找到一个最大的(a[r]*l-sum[l-1])就好了
这个东西可以抽象成在平面上的很多直线,斜率为l,截距为-sum[l-1]。
每一个决策可以看成平面上的点,当然我们只会选凸包上的点咯,然后不断维护这个凸包就好了。
考虑和后面交换同理。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int n;
long long sum[maxn];
long long ans,dans;
long long a[maxn];
struct Convex_Hull
{
int sz;
pair<long long,long long> line[maxn];
void init()
{
memset(line,0,sizeof(line));
sz=0;
}
long long get(int p,long long x)
{
return line[p].first*x+line[p].second;
}
bool is_bad(long long x,long long y,long long z)
{
long long fi = (line[x].second-line[z].second)*(line[x].first-line[y].first);
long long se = (line[y].second-line[x].second)*(line[z].first-line[x].first);
return fi<=se;
}
void add(long long x,long long y)
{
line[sz++]=make_pair(x,y);
while(sz>2&&is_bad(sz-2,sz-3,sz-1))
line[sz-2]=line[sz-1],sz--;
}
long long query(long long x)
{
int l = -1 ,r = sz-1;
while(r-l>1)
{
int mid = (l+r)/2;
if(get(mid,x)<=get(mid+1,x))l=mid;
else r=mid;
}
return get(r,x);
}
}H;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
ans=ans+a[i]*i;
}
H.init();
for(int i=2;i<=n;i++)
{
H.add(i-1,-sum[i-2]);
dans=max(dans,H.query(a[i])+sum[i-1]-a[i]*i);
}
H.init();
for(int i=n-1;i>=1;i--)
{
H.add(-(i+1),-sum[i+1]);
dans=max(dans,H.query(-a[i])+sum[i]-a[i]*i);
}
cout<<ans+dans<<endl;
}
Codeforces Round #344 (Div. 2) E. Product Sum 维护凸壳的更多相关文章
- 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 Round #556 (Div. 2) - C. Prefix Sum Primes(思维)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...
- Codeforces Round #344 (Div. 2)
水 A - Interview 注意是或不是异或 #include <bits/stdc++.h> int a[1005], b[1005]; int main() { int n; sc ...
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...
- Codeforces Round #344 (Div. 2) A
A. Interview time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Codeforces Round #344 (Div. 2) A. Interview 水题
A. Interview 题目连接: http://www.codeforces.com/contest/631/problem/A Description Blake is a CEO of a l ...
- Codeforces Round #344 (Div. 2) A. Interview
//http://codeforces.com/contest/631/problem/Apackage codeforces344; import java.io.BufferedReader; i ...
- Codeforces Round #238 (Div. 2) D. Toy Sum(想法题)
传送门 Description Little Chris is very keen on his toy blocks. His teacher, however, wants Chris to s ...
- Codeforces Round #232 (Div. 2) D. On Sum of Fractions
D. On Sum of Fractions Let's assume that v(n) is the largest prime number, that does not exceed n; u ...
随机推荐
- Perl6 Bailador框架(8):自定义400/500
第一种方法, 直接写在源码中: use Bailador; get '/' => sub { '<h1>hello, Bailador</h1>'; } get '/te ...
- centos 搭建 ss
download:https://files.cnblogs.com/files/xishaonian/ShadowsocksR-4.7.0-win.7z 使用方法:使用root用户登录,运行以下命令 ...
- v4l2驱动编写篇【转】
转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也 ...
- Mel倒谱系数
Mel倒谱系数:MFCC Mel频率倒谱系数(Mel Frequency Cepstrum Coefficient)的缩写是MFCC,Mel频率是基于人耳听觉特性提出来的,它与Hz频率成非线性对应关系 ...
- "Flags mismatch irq" register interrupt handler error
Question : When you see the log "Flags mismatch irq ............", maybe you use the same ...
- sicily 1063. Who's the Boss
Time Limit: 1sec Memory Limit:32MB Description Several surveys indicate that the taller you are, ...
- 【UOJ224】短路
具体可以看UOJmyy的blog,orz 就是一个贪心. #include<bits/stdc++.h> typedef long long ll; using namespace std ...
- 如何使用vux创建vue项目
1.安装vue-cli,通过vue-v可以查明 安装vue-cli步骤 vue init airyland/vux2 projectPath(项目名字) 2.安装依赖模块 方法1:npm instal ...
- 刷题中熟悉Shell命令之Tenth Line和Transpose File [leetcode]
首先介绍题目中要用的4个Shell命令 sed awk head tail的常用方法.(打好地基,才能建成高楼!) sed:(转自:http://www.cnblogs.com/barrychiao/ ...
- 部署Nginx
部署Nginx #下载nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz#安装依赖 yum install pcre-devel open ...