zoukankan      html  css  js  c++  java
  • 【bzoj1911-[Apio2010]特别行动队】斜率优化

    【题目描述】

        n个数,分成连续的若干段,每段的分数为a*x^2+b*x+cabc是给出的常数),其中x为该段的各个数的和。求如何分才能使得各个段的分数的总和最大。

    【输入格式】 

    1:1整数N (1 <= N <= 1000000)

    2行:3个整数abc-5<=a<=-1,|b|<=10000000,|c|<=10000000

        下来N个整数,每个数的范围为[1,100]

    【输出格式】 

        一个整数,各段分数总和的值最大

    SAMPLE INPUT

    5 4

    1 2 40

    1 4 20

    2 4 20

    2 3 30

    3 4 10

    SAMPLE OUTPUT

    50

     

    裸的斜率优化。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<queue>
     8 using namespace std;
     9 
    10 typedef long long LL;
    11 const int N=1000010;
    12 LL n,a,b,c,s[N],f[N],Q[N];
    13 
    14 // f[i]=a[i]*x[j]+b[j]
    15 // a[i]=-2*a*s[i]
    16 // x[j]=s[j]
    17 // b[j]=f[j]+a*s[j]*s[j]-b*s[j]
    18 // t[i]=a*s[i]*s[i]+b*s[i]+c
    19 
    20 double X(LL i){return s[i];}
    21 double Y(LL i){return f[i]+a*s[i]*s[i]-b*s[i];}
    22 double find_k(LL i,LL j){return (Y(i)-Y(j))/(X(i)-X(j));}
    23 
    24 int main()
    25 {
    26     // freopen("a.in","r",stdin);
    27     freopen("commando.in","r",stdin);
    28     freopen("commando.out","w",stdout);
    29     scanf("%lld",&n);
    30     scanf("%lld%lld%lld",&a,&b,&c);
    31     s[0]=0;
    32     for(int i=1;i<=n;i++)
    33     {
    34         LL x;
    35         scanf("%lld",&x);
    36         s[i]=s[i-1]+x;
    37     }
    38     f[0]=0;Q[0]=0;
    39     LL l=0,r=0,ai,j,xj,bj,ti;
    40     for(int i=1;i<=n;i++)
    41     {
    42         ai=(-2)*a*s[i];
    43         while(l<r && find_k(Q[l],Q[l+1])>=(-ai)) l++;
    44         j=Q[l];
    45         xj=s[j];
    46         bj=f[j]+a*s[j]*s[j]-b*s[j];
    47         ti=a*s[i]*s[i]+b*s[i]+c;
    48         f[i]=ai*xj+bj+ti;
    49         while(l<r && find_k(Q[r],Q[r-1])<find_k(i,Q[r])) r--;
    50         Q[++r]=i;
    51         // printf("f %d  =  %d
    ",i,f[i]);
    52     }
    53     printf("%lld
    ",f[n]);
    54     return 0;
    55 }

     

  • 相关阅读:
    Packet Tracer 5.2实验(十五) 网络端口地址转换NAPT配置
    Packet Tracer 5.3实验(十六) 网络设备系统升级
    PostgreSQL学习手册(一) 数据表
    Access insert 语法错误
    Access2003转换成SQL2005。
    C#实现ACCESS数据库备份还原
    js 图片滚动
    根据日期算出天数
    datetime赋空值
    如何把Sql Server2005 数据库转换成Access
  • 原文地址:https://www.cnblogs.com/KonjakJuruo/p/5890571.html
Copyright © 2011-2022 走看看