1. 程式人生 > >[BZOJ2216]Lightning Conductor

[BZOJ2216]Lightning Conductor

limit ++ 16px 最優決策 class i+1 這也 方程 mat

原來決策單調性指的是這個東西...

一些DP可以寫成$f_i=\max\limits_{j\lt i}g(i,j)$,設$p_i(p_i<j)$表示使得$g(i,j)$最大的$j$,如果$p_1\leq\cdots\leq p_n$,那麽我們稱這個DP滿足決策單調性,稱$p_i$為$i$的最優決策點

決策單調性可以用整體二分來做,設當前要處理$f_{l\cdots r}$且最優決策點的範圍是$[h,t]$,那麽我們先求出$f_{mid}$,這個直接暴力從$\left[h,\min(mid,t)\right]$轉移即可,假設$mid$的最優決策點是$d$,那麽我們可以遞歸做$(l,mid-1,h,d)$和$(mid+1,r,d,t)$,二分總共$O(\log_2n)$層,每一層最多$O(n)$,總時間復雜度$O\left(n\log_2n\right)$

這題的DP方程是$f_i=\max\{a_j+\sqrt{\left|i-j\right|}\}-a_i$,為了把絕對值去掉,我們作限制$j\lt i$,正反各做一遍取最大值即可

$f_i=\max\limits_{j\lt i}\{a_j+\sqrt{i-j}\}-a_i$

設$i$的最優決策點為$p$,那麽對於$\forall k\lt p$有$a_k+\sqrt{i-k}\leq a_p+\sqrt{i-p}$

因為$\sqrt{x+1}-\sqrt x$是單調遞減的,所以$\sqrt{i+1-k}-\sqrt{i-k}\leq\sqrt{i+1-p}-\sqrt{i-p}$

把它加到上面,我們得到$a_k+\sqrt{i+1-k}\leq a_p+\sqrt{i+1-p}$

這也就說明了$i+1$的最優決策點$\geq p$,也就是說這個DP滿足決策單調性

#include<stdio.h>
#include<math.h>
typedef double du;
du max(du a,du b){return ceil(a>b?a:b);}
void swap(int&a,int&b){
	int c=a;
	a=b;
	b=c;
}
int a[500010];
void solve(du*f,int l,int r,int h,int t){
	if(l>r||h>t)return;
	int mid,i,d;
	du res=-2147483647.;
	mid=(l+r)>>1;
	for(i=h;i<=t&&i<=mid;i++){
		if(a[i]+sqrt(mid-i)>res){
			res=a[i]+sqrt(mid-i);
			d=i;
		}
	}
	f[mid]=res-a[mid];
	solve(f,l,mid-1,h,d);
	solve(f,mid+1,r,d,t);
}
du f[500010],g[500010];
int main(){
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",a+i);
	solve(f,1,n,1,n);
	for(i=1;i<=n>>1;i++)swap(a[i],a[n-i+1]);
	solve(g,1,n,1,n);
	for(i=1;i<=n;i++)printf("%.0lf\n",max(f[i],g[n-i+1]));
}

[BZOJ2216]Lightning Conductor