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 ...
随机推荐
- 关于shutdown和close
示例代码: void str_cli(FILE *fp, int sockfd) { pid_t pid; char sendline[MAXLINE], recvline[MAXLINE]; ) { ...
- Exploring Qualcomm's TrustZone Implementation
转自 http://bits-please.blogspot.com/2015/08 (需要FQ, 狗日的墙) In this blog post, we'll be exploring Qua ...
- 用tkinter实现的gui小工具
import tkinter import requests import json from tkinter import * class FindLocation(object): def __i ...
- 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程 http://blog.csdn.net/liujiayu2/article/details/5 ...
- C# 网络编程小计 20150202
在学习网络Socket编程之前必须得学会多线程编程,这个是经常会用的到 可参考:http://www.cnblogs.com/GIS_zhou/articles/1839248.html System ...
- ajax之深入解析(2)
我们前面实现了用原生的JavaScript代码实现ajax的异步数据传输.接下来,我们再使用一个流行的js框架jQuery来实现ajax. 通过 jQuery AJAX 方法,我们能够使用 HTTP ...
- python_day6学习笔记
一.Logger模块 logging.basicConfig函数 可通过具体参数来更改logging模块默认行为,可用参数有 filename: 用指定的文件名创建FiledHandler(后边会具体 ...
- [转]nginx启动期都做了哪些事
nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式. 它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关).那么,首先我们要 ...
- 玩转RaspberryPi
step1:烧制树莓派内存卡 可以用[Linux系统烧制]http://www.williamsang.com/archives/1764.html 如果用windows烧制的话,就用Win32 Di ...
- “无法在web服务器上启动调试,不是Debugger User组成员..."
在使用VS.net2003开发asp.net项目时,有时候在你调试项目时,会提示”无法在web服务器上启动调试,不是Debugger User组成员..."这样一个错误信息.很是让人头疼,一 ...