首页 > 代码库 > Bzoj1911 [Apio2010]特别行动队

Bzoj1911 [Apio2010]特别行动队

 

1911: [Apio2010]特别行动队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 3969  Solved: 1873

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

技术分享

Source

 

斜率优化DP

f[分组末尾]=最优解

f[i] = max{f[j]+A(s[i]-s[j])^2+B(s[i]-s[j])+C}  (0<=j<i) (s[]是战斗力前缀和)

对于任意两个决策点j>k,假设j比k更优,则有:
f[j]+A(s[i]-s[j])^2+B(s[i]-s[j])+C >= f[k]+A(s[i]-s[k])^2+B(s[i]-s[k])+C

设G(j)=f[j]+A*s[j]^2-B*s[j] ,H(j)=-2*A*s[j]

由于H(j)>H(k),得到[G(j)-G(k)]/[H(j)-H(k)]>=-s[i]

 1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define LL long long 8 using namespace std; 9 const int mxn=1e6+10;10 int read(){11     int x=0,f=1;char ch=getchar();12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}14     return x*f;15 }16 LL f[mxn];17 int n;18 int a,b,c;19 int x[mxn];20 LL s[mxn];21 LL gdp(int i,int x){22     return f[x]+a*(s[i]-s[x])*(s[i]-s[x])+b*(s[i]-s[x])+c;23 }24 LL gup(int x,int y){25     return f[x]-f[y]+a*(s[x]*s[x]-s[y]*s[y])-b*(s[x]-s[y]);26 }27 LL gdown(int x,int y){28     return -2*a*s[x]+2*a*s[y];29 }30 int hd=0,tl=0;31 int q[mxn];32 int main(){33     n=read();34     a=read();b=read();c=read();35     int i,j;36     for(i=1;i<=n;i++){37         x[i]=read();38         s[i]=s[i-1]+x[i];39     }40     for(i=1;i<=n;i++){41         while(hd<tl && gup(q[hd],q[hd+1])<=-s[i]*gdown(q[hd],q[hd+1]))hd++;42         f[i]=gdp(i,q[hd]);43         while(hd<tl && gup(q[tl],i)*gdown(q[tl-1],q[tl])>=gup(q[tl-1],q[tl])*gdown(q[tl],i))tl--;44         q[++tl]=i;45     }46     printf("%lld\n",f[n]);47     return 0;48 }

 

Bzoj1911 [Apio2010]特别行动队