程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 斜率優化專題4——bzoj 1911: [Apio2010] 特別行動隊 題解

斜率優化專題4——bzoj 1911: [Apio2010] 特別行動隊 題解

編輯:C++入門知識

【原題】

 

1911: [Apio2010]特別行動隊

Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 2134 Solved: 911
[Submit][Status]

Description

\

Input

\

Output

\

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

\


 

【分析】只要跟著我前面的題目走,這道題真的是太水了。神馬題解都不用參考,公式隨便推。

易知方程是f[i]=max(f[j]+A*(sum[i]-sum[j])^2+B*(sum[i]-sum[j])+C)
設k比j優。
f[k]+A(sum[i]-sum[k])^2+B(sum[i]-sum[k])+C>f[j]+A(sum[i]-sum[j])^2+B(sum[i]-sum[j])+C
f[k]-2*A*sum[i]*sum[k]+A*sum[k]^2-B*sum[k]>f[j]-2*A*sum[i]*sum[j]+A*sum[j]^2-B*sum[j]
f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k])>2*A*sum[i]*(sum[k]-sum[j])
(f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k]))/2/(sum[k]-sum[j])/A

【代碼】

 

#include
#include
using namespace std;
long long n,a[1000005],f[1000005],q[1000005],sum[1000005],ans,h,t,i,A,B,C,j;
long long M(long long x){return x*x;}
double xie(long long k,long long j)
{
  double temp=(f[k]-f[j]+A*(M(sum[k])-M(sum[j]))+B*(sum[j]-sum[k])+0.0)/2.0/(sum[k]-sum[j])/A;
  return temp;
}
int main()
{
  scanf("%lld",&n);
  scanf("%lld%lld%lld",&A,&B,&C);
  for (i=1;i<=n;i++)
    scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
  f[0]=0;h=t=1ll;q[1]=0;
  for (i=1;i<=n;i++)
  {
    while (hxie(i,q[t])) t--;  
    q[++t]=i;  
  }  
  printf("%lld",f[n]);
  return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved