1911: [Apio2010]特别行动队
Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5224 Solved: 2571
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
-1 10 -20
2 2 3 4
Sample Output
HINT
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const ll maxn = 1000010; ll n,a,b,c,sum[maxn],q[maxn * 2],l,r,f[maxn]; ll K(ll i) { return -2 * a * sum[i]; } ll B(ll i) { return f[i] + a * sum[i] * sum[i] - b * sum[i]; } ll Y(ll i,ll j) { return sum[j] * K(i) + B(i); } bool check(int y1,int y2,int y3) { ll temp1 = (K(y1) - K(y3)) * (B(y2) - B(y1)); ll temp2 = (K(y1) - K(y2)) * (B(y3) - B(y1)); return temp1 <= temp2; } int main() { scanf("%lld",&n); scanf("%lld%lld%lld",&a,&b,&c); for (int i = 1; i <= n; i++) { scanf("%lld",&sum[i]); sum[i] += sum[i - 1]; } l = 0,r = 0; for (int i = 1; i <= n; i++) { while (l < r && Y(q[l],i) <= Y(q[l + 1],i)) l++; f[i] = Y(q[l],i) + a * sum[i] * sum[i] + b * sum[i] + c; while (l < r && check(i,q[r],q[r - 1])) r--; q[++r] = i; } printf("%lld\n",f[n]); return 0; }