zoukankan      html  css  js  c++  java
  • bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队

    Time Limit: 4 Sec  Memory Limit: 64 MB

    Description

    Input

    Output

    Sample Input

    4
    -1 10 -20
    2 2 3 4

    Sample Output

    9

    HINT

    Source

    dp方程:

    如果j>k且j比k更优

    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define N 1000100
    #define db double
    char xB[1<<15],*xS=xB,*xTT=xB;
    #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
    #define isd(c) (c>='0'&&c<='9')
    inline int read(){
        char xchh;
        int xaa;
        while(xchh=getc(),!isd(xchh));(xaa=xchh-'0');
        while(xchh=getc(),isd(xchh))xaa=xaa*10+xchh-'0';return xaa;
    }
    int n,a,b,c,x[N],q[N],l,r,t;
    ll f[N],sum[N];
    inline ll sqr(ll x){return x*x;}
    inline db cal(int j,int k){return (db)(f[j]+a*sqr(sum[j])-b*sum[j]-f[k]-a*sqr(sum[k])+b*sum[k])/(db)(2*a*(sum[j]-sum[k]));}
    int main()
    {
        scanf("%d%d%d%d",&n,&a,&b,&c);
        for(int i=1;i<=n;i++) x[i]=read();
        for(int i=1;i<=n;i++) sum[i]=sum[i-1]+x[i];
        for(int i=1;i<=n;i++)
        {
            while(l<r&&cal(q[l],q[l+1])<sum[i]) l++;
            t=q[l];
            f[i]=f[t]+a*sqr(sum[i]-sum[t])+b*(sum[i]-sum[t])+c;
            while(l<r&&cal(q[r-1],q[r])>cal(q[r],i)) r--;
            q[++r]=i;
        }
        printf("%lld
    ",f[n]);
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    python——ddt + excel + HTMLTestRunner 实现接口测试
    APP模拟弱网环境测试教程
    静态语言与动态语言
    Charles手机抓包实用教程
    DS博客作业08--课程总结
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    第四次作业
    C博客作业01--分支、顺序结构
  • 原文地址:https://www.cnblogs.com/lkhll/p/6667377.html
Copyright © 2011-2022 走看看