[BZOJ2216]Lightning Conductor
原來決策單調性指的是這個東西...
一些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