• 洛谷P3628 [APIO2010]特别行动队(斜率优化)


    传送门

    先写出转移方程$$dp[i]=max{dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c}$$

    假设$j$比$k$更优,则有$$dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c>dp[k]+a*(sum[i]-sum[k])^2+b*(sum[i]-sum[k])+c$$

    展开,并消去同类项之后得$$dp[j]-2*a*sum[i]*sum[j]+a*sum[j]^2-b*sum[j]>dp[k]-2*a*sum[i]*sum[k]+a*sum[k]^2-b*sum[k]$$

    移项,得$$(dp[j]+a*sum[j]^2-b*sum[j])-(dp[k]+a*sum[k]^2-b*sum[k])>2*a*sum[i]*sum[j]-2*a*sum[i]*sum[k]$$

    设$Y[i]=dp[i]+a*sum[i]^2-b*sum[i],X[i]=sum[i]$

    则有$$Y[j]-Y[k]>2*a*sum[i]*X[j]-2*a*sum[i]*X[k]$$

    $$frac{Y[j]-Y[k]}{X[j]-X[k]}>2*a*sum[i]$$

    那么就是要我们维护一个上凸包,简单来说就是把原来维护下凸包的那些东西给反过来就好了(ps:我今天刚知道原来凸包还能是上凸的……我太菜了……)

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #define ll long long
     5 using namespace std;
     6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
     7 char buf[1<<21],*p1=buf,*p2=buf;
     8 inline int read(){
     9     #define num ch-'0'
    10     char ch;bool flag=0;int res;
    11     while(!isdigit(ch=getc()))
    12     (ch=='-')&&(flag=true);
    13     for(res=num;isdigit(ch=getc());res=res*10+num);
    14     (flag)&&(res=-res);
    15     #undef num
    16     return res;
    17 }
    18 const int N=1000005;
    19 int sum[N],q[N],h,t,n;ll dp[N],a,b,c;
    20 inline ll Y(int i){return dp[i]+a*sum[i]*sum[i]-b*sum[i];}
    21 inline double slope(int j,int k){return 1.0*(Y(j)-Y(k))/(sum[j]-sum[k]);}
    22 inline ll check(int x){return a*x*x+b*x+c;}
    23 int main(){
    24     //freopen("testdata.in","r",stdin);
    25     n=read(),a=read(),b=read(),c=read();
    26     for(int i=1;i<=n;++i) sum[i]=read()+sum[i-1];
    27     for(int i=1;i<=n;++i){
    28         int k=2*a*sum[i];
    29         while(h<t&&slope(q[h],q[h+1])>k) ++h;
    30         dp[i]=dp[q[h]]+check(sum[i]-sum[q[h]]);
    31         while(h<t&&slope(q[t],q[t-1])<slope(q[t-1],i)) --t;q[++t]=i;
    32     }
    33     printf("%lld
    ",dp[n]);
    34     return 0;
    35 }
  • 相关阅读:
    python 操作ie 登陆土豆再退出
    python之sqlite3使用详解(转)
    python 获取当前目录下文件(转)
    python中使用time模块计算代码执行效率的精度测试(转)
    pythonhttplib模块使用(转)
    python技巧31[python中使用enum](转)
    python怎样压缩和解压缩ZIP文件(转)
    httplib2python下的http请求终结者(转)
    Python:使用ctypes库调用外部DLL(转)
    整理了下控制ie的代码(转)
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9545985.html
Copyright © 2020-2023  润新知