1. 程式人生 > >單調棧 BZOJ2364 城市美化

單調棧 BZOJ2364 城市美化

-h int ring d+ clas mes double bmi des

2364: 城市美化

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 182 Solved: 42
[Submit][Status][Discuss]

Description

城市A需要美化市容市貌,現在有n個樓房排成一列,每個樓房的高都在[1,1000]的範圍內。市長請了一批工程師來對其中一些樓房進行修建,使樓房高度得到上升(不能讓樓房高度下降),對一棟樓房修建,使其高度上升x,需要x2的費用。 當所有修建完成後,我們把相鄰兩樓高度的絕對值乘以c(0<=c<=1000),得到的就是城市損失的錢,我們把它同樣看作是費用。現在想請你合理安排修建樓房的方案,使得所需費用最小。

Input

第一行兩個數n和c。 接下來n行,每行一個數,表示每棟樓的高度。

Output

僅一行一個數,表示最小所需的費用。

Sample Input

5 5
2
2
1
6
8

Sample Output

31

HINT

數據範圍

對於100%的數據,1<=n<=50000

f[i]表示前i個且最後一段與 i-1 相同的最小代價。

可以得到一些性質:(1) 當一個樓房兩邊都比它高,或者一個樓房處於邊界,那麽將它向上調整才能使代價減小;

         (2) 若一個樓房兩邊都高於它,且最後它向上調整了,則兩側的樓房高度都應與它相同,直到有比它更高的為止。

則可以維護一個單調遞減的樓房轉移,ask用於二次函數求極值。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 int n,c,top;
 8 int stack[50010];
 9 long long h[50010],sum[50010],sumpow[50010],f[50010];
10 long long ask(long long a,long
long b,long long d,long long mn,long long mx){ 11 double t=(double)-b/(2*a); 12 long long x; 13 if(mn<=t&&t<=mx) x=round(t); 14 if(mn>t) x=mn; 15 if(mx<t) x=mx; 16 return a*x*x+b*x+d; 17 } 18 long long solve(int ll,int rr,long long mn){ 19 if(ll+1==rr) return (ll==1||rr==n+2)?0:abs(h[rr]-h[ll])*c; 20 long long a=rr-ll-1,b=-2*(sum[rr-1]-sum[ll]),d=sumpow[rr-1]-sumpow[ll]; 21 long long mx=min(h[ll],h[rr]); 22 if(ll!=1) b-=c,d+=c*h[ll]; 23 if(rr!=n+2) b-=c,d+=c*h[rr]; 24 return ask(a,b,d,mn,mx); 25 } 26 long long work(){ 27 stack[++top]=1; 28 for(int i=2;i<=n+2;i++){ 29 f[i]=1e60; 30 int end=0; 31 while(top&&h[stack[top]]<h[i]){ 32 f[i]=min(f[i],f[stack[top]]+solve(stack[top],i,end)); 33 end=h[stack[top--]]; 34 } 35 f[i]=min(f[i],f[stack[top]]+solve(stack[top],i,end)); 36 stack[++top]=i; 37 } 38 return f[n+2]; 39 } 40 int main(){ 41 scanf("%d%d",&n,&c); 42 h[1]=h[n+2]=1e60; 43 for(int i=1;i<=n;i++) scanf("%d",&h[i+1]); 44 for(int i=1;i<=n+2;i++){ 45 sum[i]=sum[i-1]+h[i]; 46 sumpow[i]=sumpow[i-1]+h[i]*h[i]; 47 } 48 printf("%lld",work()); 49 return 0; 50 }

單調棧 BZOJ2364 城市美化