zoukankan      html  css  js  c++  java
  • 特别行动队

    这题不像前面那样板子了,至少我不认为它是个板子。

    推出的方程长这样子:f[j]+a*sum[j]^2-b*sum[j]=(2*a*sum[i])*sum[j]+f[i]-a*sum[i]^2-b*sum[i]-c

    看一下数据范围,a恒为负,这时斜率2*a*sum[i]单调递减,同时我们要求截距的最大值。

    此时维护上凸壳(斜率单调递减)

    看代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int maxn=1000000+10;
    int n,a,b,c,sum[maxn],f[maxn],q[maxn];
    int yval(int x,int y){
        return f[y]+a*sum[y]*sum[y]-b*sum[y]-f[x]-a*sum[x]*sum[x]+b*sum[x];
    }
    int xval(int x,int y){
        return sum[y]-sum[x];
    }
    signed main(){
        cin>>n>>a>>b>>c;
        int tmp;
        for(int i=1;i<=n;i++){
            scanf("%lld",&tmp);
            sum[i]=sum[i-1]+tmp;
            f[i]=-1e12;
        }
        int l=1,r=1;
        q[l]=0;
        for(int i=1;i<=n;i++){
            while(l<r&&yval(q[l],q[l+1])>=xval(q[l],q[l+1])*2*a*sum[i])l++;
            f[i]=f[q[l]]+a*(sum[i]-sum[q[l]])*(sum[i]-sum[q[l]])+b*(sum[i]-sum[q[l]])+c;
            while(l<r&&yval(q[r-1],q[r])*xval(q[r],i)<=xval(q[r-1],q[r])*yval(q[r],i))r--;
            q[++r]=i;
        }
        printf("%lld
    ",f[n]);
        return 0;
    }
  • 相关阅读:
    Hdu 4496 D-City
    Hdu 1213 How Many Tables
    T1387:搭配购买(buy)
    codevs 2597 团伙
    Hdu 1232 畅通工程
    RQNOJ PID331 家族
    提高组day4
    xjoi2018提高组训训练25
    关于upp和lower
    矩阵快速幂求fib
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12386809.html
Copyright © 2011-2022 走看看