zoukankan      html  css  js  c++  java
  • BZOJ1911 [Apio2010]特别行动队

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

     

     

     本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!


    Description

    Input

    Output

    Sample Input

    4
    -1 10 -20
    2 2 3 4

    Sample Output

    9

    HINT

     
     
     
    正解:DP+斜率优化
    解题报告:
      朴素DP很好想,就是$${f[i]=max(f[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c) (j<i)}$$
      但是只有50分,考虑优化。
      因为这个式子一看就很可推,试着证明有没有单调性或者可以弄出斜率...
      如果j>k,且j比k更优,当且仅当
        $${f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])>2*a*(sum[j]-sum[k])*sum[i]}$$
      移过去就是$${frac {f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])}{2*a*(sum[j]-sum[k])} < sum[i] }$$
      (ps:带a的那个式子,就是分母,是小于0的,所以要变号...)
       然后维护一个斜率单增的单调队列,相当于是一个下凸的凸包,就ok了。
     
     1 //It is made by ljh2000
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 using namespace std;
    14 typedef long long LL;
    15 const int inf = (1<<30);
    16 const int MAXN = 1000011;
    17 int n;
    18 LL a,b,c;
    19 LL s[MAXN],f[MAXN];
    20 int dui[MAXN],head,tail;
    21 
    22 inline int getint()
    23 {
    24     int w=0,q=0; char c=getchar();
    25     while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 
    26     while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
    27 }
    28 inline LL count(int x,int y){   return ( (f[x]-f[y])+a*(s[x]*s[x]-s[y]*s[y])-b*(s[x]-s[y]) )/(a*2*(s[x]-s[y])); }
    29 inline void work(){
    30     n=getint(); a=getint(); b=getint(); c=getint(); int x;
    31     for(int i=1;i<=n;i++) x=getint(),s[i]=s[i-1]+x;
    32     head=tail=1; dui[tail]=0; int from;
    33     for(int i=1;i<=n;i++) {
    34     while(head<tail && count(dui[head+1],dui[head])<s[i]) head++;
    35     from=dui[head]; f[i]=f[from]+a*(s[i]-s[from])*(s[i]-s[from])+b*(s[i]-s[from])+c;
    36     while(head<tail && count(dui[tail-1],dui[tail])>count(dui[tail],i)) tail--;
    37     dui[++tail]=i;
    38     }
    39     printf("%lld",f[n]);
    40 }
    41 
    42 int main()
    43 {
    44     work();
    45     return 0;
    46 }
  • 相关阅读:
    项目管理改进实践
    Abount StoneAge Dictionary Project
    词库引擎核心设计
    JDOM / XPATH编程指南
    2007年图灵奖揭晓
    pjscrape: A webscraping framework written in Javascript, using PhantomJS and jQuery
    centos install node.js
    Posts tagged pyqt4
    install python262 写得不错
    WebSPHINX: A Personal, Customizable Web Crawler
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6014345.html
Copyright © 2011-2022 走看看