1. 程式人生 > >斜率優化理解【16年 瀋陽區域賽 The Elder 】

斜率優化理解【16年 瀋陽區域賽 The Elder 】

舉個例子來理解

16年瀋陽區域賽【樹形dp+斜率優化】

題意:

給你n個點,n-1條邊的樹。每條邊有一個權值w。給你一個值p。

1號節點為根節點。求1號點到所有節點的路徑中的最小權值  的最大值。

權值計算方法:將這條路可以一次走完,權值是(dis[u]-dis[1])*(dis[u]-dis[1]),也可以分段走完,每經過一個點權值加p,假如經過一個點x,那麼權值可以是(dis[u]-dis[x])*(dis[u]-dis[x])+p+(dis[x]-dis1])*(dis[x]-dis1])

如果一個一個找分段的點就是O(N^2),那麼可以用斜率優化的方法

終點是u,如果v點比w點作為暫停的點更優,那麼dp[i]是到達i的的最小的權值

   dp[v]+p+(dis[u]-dis[v])*(dis[u]-dis[v])<=dp[w]+p+(dis[u]-dis[w])*(dis[u]-dis[w]);

dp[v]+dis[u]^2+dis[v]^2-2*dis[u]*dis[v]<=dp[w]+dis[u]^2+dis[w]^2-2*dis[u]*dis[w];

             dp[v]+dis[v]^2-2*dis[u]*dis[v]<=dp[w]+dis[w]^2-2*dis[u]*dis[w];

             dp[v]+dis[v]^2-dp[w]-dis[w]^2<=2*dis[u]*(dis[v]-dis[w]);

不妨假設f[x]=dp[x]+dis[x]^2;

那麼 f[v]-f[w]<=2*dis[u]*(dis[v]-dis[w]);

,

假設某點是(dis[x],f[x]),那麼就是斜率問題了,當且僅當v>w且時v點更新u,比w點更新w優。

這時候就需要維護凸包了:

維護凸包(下凸)原因:

假設存在這樣的三個點

,很明顯他們存在這樣的關係

那麼他們跟2*dis[u]會存在三種可能的關係

1.

2.

3.

未完待續