題目大意:給你一顆樹,求一條路徑使得其lis最長。n≤2
×105
n\le2\times10^5
n≤2×10
5題解:考慮維護從子樹走到當前點的lis和lds的那個棧陣列,然後長鏈剖分來保證複雜度即可,其餘和樸素lis類似,合併陣列的時候顯然直接取min即可。
注意一些細節。
呵呵。
#include
#include
#include
#include
#define gc getchar()
#define n 200010
#define debug(x) cerr<<#x<<"="<#define sp <<" "
#define ln inline
intinn()
struct edgese[n<<1]
;int a[n]
,h[n]
,etop,son[n]
,l[n]
,ans;
inline
intadd_edge
(int u,
int v)
inline
intgabs
(int x)
inline
intsgn
(int x)
intgetl
(int x,
int fa=0)
inline
intshow
(int
*f,int n)
inline
intquery
(int
*f,int n,
int x)
return r;
}inline
intquery
(int
*f,int n,
int*g,
int m)
inline
intins
(int
*f,int
&n,int x)
f[l]
=x,n=
max(n,l)
;return0;
}inline
intupdate
(int
*f,int
&n,int
*g,int m)
intdfs
(int x,
int*is,
int*ds,
int&it,
int&dt,
int fa=0)
ans=
max(ans,
max(it,dt));
return0;
}int
main()
thr 樹鏈剖分 dp
首先,可以有乙個 dp 的思路 不難發現本題中,三個點如果互相距離相同,那麼一定有乙個 中心點 到三個點的距離都相同 那麼我們可以把本題轉化計算以每個點為根的情況下,從三個不同的子樹中選擇深度相同的三個點的方案數 進一步,我們選定1號點為根,這樣定義我們的 dp 方程 f u dis 表示以 u 為...
長鏈剖分優化樹形dp
apio鐵牌告辭 開場想打暴力然後gedit碼 5個小時沒寫完三題最低檔暴力真是快樂 聽課也就學到了一丟丟這個東西。模板題 首先k級兄弟可以一遍dfs的時候丟到k級父親上變成求k級孩子的詢問。求k級孩子有個很簡單的做法,直接dfs的時候維護掃到某個點時記錄下的每種dep出現次數,對於所有求這個點k級...
長鏈剖分優化樹上dp
長鏈剖分可以把維護子樹中只與深度有關的資訊做到線性的時間複雜度。例題cf1009f 給一棵樹,定義每個點的dom值為,以該點為根的子樹重中,節點數最多的那一層的層數,即那一層距離這個根節點有幾條邊,如果多層節點數相同,取最小的層數。例如單獨葉節點的dom值是0,一條垂直的鏈的dom值也是0 每層數量...