一本通1612特别行动队

1612:特别行动队

时间限制: 1000 ms         内存限制: 524288 KB

Description

Input

Output

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

 
sol:斜率优化dp裸题

j<k<i 若k比j优
dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c (1)
dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c (2)
(2) >= (1)
dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c (1)
dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c (2)
若 (2) >= (1) 则
dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]

(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0'); return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=1000005;
int n,a,b,c;
ll Qzh[N];
ll dp[N];
int main()
{
//    freopen("commando3.in","r",stdin);
    int i,j;
    R(n);
    R(a); R(b); R(c);
    for(i=1;i<=n;i++)
    {
        Qzh[i]=Qzh[i-1]+read();
    }
    memset(dp,-63,sizeof dp);
    dp[0]=0;
    for(i=1;i<=n;i++)
    {
        for(j=0;j<i;j++)
        {
            dp[i]=max(dp[i],dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c);
        }
    }
    Wl(dp[n]);
    return 0;
}
/*
input
4
-1 10 -20
2 2 3 4
output
9
*/
暴力代码
/*
    j<k<i 若k比j优 
    dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c  (1)
    dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c  (2)
    (2) >= (1)
    dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c  (1)
    dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c  (2)
    若 (2) >= (1) 则
    dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]
    则
    (dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0'); return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=1000005;
int n,a,b,c;
ll Qzh[N];
ll dp[N],Que[N];
inline bool Panduan(int j,int k,int i) //j<k<i
{
    ll S1=(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]);
    ll S2=a*2*Qzh[i]*(Qzh[k]-Qzh[j]);
    return (S1>=S2)?(1):(0);
}
//(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])
inline bool Panduan_Rev(int j,int k,int i) //j<k<i
{
    ll S1=((dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]))*(Qzh[i]-Qzh[k]);
    ll S2=((dp[i]+a*Qzh[i]*Qzh[i]-b*Qzh[i])-(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k]))*(Qzh[k]-Qzh[j]);
    return (S1<=S2)?(1):(0);
}
int main()
{
    int i,j;
    R(n);
    R(a); R(b); R(c);
    for(i=1;i<=n;i++)
    {
        Qzh[i]=Qzh[i-1]+read();
    }
    dp[0]=0;
    int Head=1,Tail=1; Que[1]=0;
    for(i=1;i<=n;i++)
    {
        while(Head<Tail&&Panduan(Que[Head],Que[Head+1],i)) Head++;
        j=Que[Head];
        dp[i]=dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c;
        while(Head<Tail&&Panduan_Rev(Que[Tail-1],Que[Tail],i)) Tail--;
        Que[++Tail]=i;
    }
    Wl(dp[n]);
    return 0;
}
/*
input
4
-1 10 -20
2 2 3 4
output
9
*/
斜率优化
 
posted @ 2019-02-21 21:26  yccdu  阅读(299)  评论(0)    收藏  举报