zoukankan      html  css  js  c++  java
  • 笔记-[APIO2010]特别行动队

    笔记-[APIO2010]特别行动队

    [APIO2010]特别行动队


    (f_i) 表示将 ((j+1,j+2,dots,i)) 分为一组,已解决 (i) 之前的士兵的最小代价。

    (a<0)

    [egin{split} f_i=&max{f_j+aX^2+bX+c}(j<i)\ =&max{f_j+aleft(sum_{h=j+1}^ix_h ight)^2+bleft(sum_{h=j+1}^ix_h ight)+c}\ end{split} ]

    (s_i=sum_{h=1}^i x_h)

    [egin{split} f_i=&max{f_j+aleft(sum_{h=j+1}^ix_h ight)^2+bleft(sum_{h=j+1}^ix_h ight)+c}\ =&max{f_j+a(s_i-s_j)^2+b(s_i-s_j)+c}\ =&max{f_j+a(s_i^2-2s_is_j+s_j^2)+b(s_i-s_j)+c}\ =&max{f_j+as_i^2-2as_is_j+as_j^2+bs_i-bs_j+c}\ =&max{f_j-2as_is_j+as_j^2-bs_j}+as_i^2+bs_i+c\ end{split} ]

    考虑 (j=k)(j=t) 更优:

    [egin{split} f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\ f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\ (f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)>&2as_is_k-2as_is_t\ frac{(f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)}{s_k-s_t}>&2as_i\ end{split} ]

    搞定。


    Code

    #include <bits/stdc++.h>
    using namespace std;
    
    //Start
    #define re register
    #define il inline
    #define mk make_pair
    #define pb push_back
    #define db double
    #define lng long long
    #define fi first
    #define se second
    const int inf=0x3f3f3f3f;
    const lng INF=0x3f3f3f3f3f3f3f3f;
    
    //Data
    int n,a,b,c;
    vector<int> x;
    vector<lng> s,f;
    
    //DP
    template<typename T> il T p2(re T x){return x*x;}
    il db fx(re int x){return s[x];}
    il db fy(re int x){return f[x]+p2(s[x])*a-s[x]*b;}
    il db slope(re int k,re int t){return (fy(k)-fy(t))/(fx(k)-fx(t));}
    il lng DP(){
    	re int l=1,r=0; re vector<int> q(n+7); q[++r]=0;
    	for(re int i=1;i<=n;i++){
    		while(l<r&&slope(q[l],q[l+1])>=s[i]*2*a) l++;
    		f[i]=f[q[l]]+p2(s[i]-s[q[l]])*a+(s[i]-s[q[l]])*b+c;
    		while(l<r&&slope(q[r-1],q[r])<=slope(q[r],i)) r--;
    		q[++r]=i;
    	}
    	return f[n];
    }
    
    //Main
    int main(){
    	scanf("%d%d%d%d",&n,&a,&b,&c);
    	x=vector<int>(n+7);
    	s=f=vector<lng>(n+7);
    	for(re int i=1;i<=n;i++)
    		scanf("%d",&x[i]),s[i]=s[i-1]+x[i];
    	printf("%lld
    ",DP());
    	return 0;
    }
    

    [Hugecolor{#ddd}{ exttt{---END---}} ]

  • 相关阅读:
    67. Add Binary
    66. Plus One
    64. Minimum Path Sum
    63. Unique Paths II
    How to skip all the wizard pages and go directly to the installation process?
    Inno Setup打包之先卸载再安装
    How to change the header background color of a QTableView
    Openstack object list 一次最多有一万个 object
    Openstack 的 Log 在 /var/log/syslog 里 【Ubuntu】
    Git 分支
  • 原文地址:https://www.cnblogs.com/George1123/p/12592878.html
Copyright © 2011-2022 走看看