單調棧 BZOJ2364 城市美化
阿新 • • 發佈:2017-07-30
-h int ring d+ clas mes double bmi des
Submit: 182 Solved: 42
[Submit][Status][Discuss]
2
2
1
6
8
2364: 城市美化
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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 52
2
1
6
8
Sample Output
31HINT
數據範圍
對於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,longlong 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 城市美化