您的位置:首页 > 其它

BZOJ1911 [APIO2010] 特别行动队

2016-01-10 14:04 211 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1911

Description

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define rep(i,l,r) for(int i=l; i<=r; i++)
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std;
typedef long long ll;
const int maxn = 1000010;
ll n,A,B,C,head,tail,f[maxn],q[maxn],s[maxn];
inline ll read(){
ll ans = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar())
if (c == '-') f = -1;
for(; isdigit(c); c = getchar())
ans = ans * 10 + c - '0';
return ans * f;
}
inline ll calc(int x){
return f[x] + A * s[x] * s[x];
}
inline ll get(int i,int j){
return f[j] + A * (s[i] - s[j]) * (s[i] - s[j]) + B * (s[i] - s[j]) + C;
}
int main(){
n = read(); A = read(); B = read(); C = read();
rep(i,1,n) s[i] = s[i-1] + read();
head = tail = f[0] = q[0] = 0;
rep(i,1,n){
while (head < tail && calc(q[head+1]) - calc(q[head]) >= (2 * A * s[i] + B) * (s[q[head+1]] - s[q[head]])) head++;
f[i] = get(i,q[head]);
while (head < tail && (calc(q[tail]) - calc(q[tail-1])) * (s[i] - s[q[tail]]) <= (calc(i) - calc(q[tail])) * (s[q[tail]] - s[q[tail-1]])) tail--;
q[++tail] = i;
}
printf("%lld\n",f
);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: