$Description$
给定一棵带点权树,求树上最长上升子序列的长度
$Solution$
以下的$lis$和$lds$均表示从当前点$u$的某个子树节点权值为开头$,w_u$为结尾的$lis$或$lds,m$表示所有节点中最大的权值
对于每个点维护一棵动态开点权值线段树,线段树中下标$i$存储以$~i~$这个数为结尾的$lis$和$~lds($最长上升子序列和最长下降子序列$),$利用线段树合并更新
那么如何更新答案呢$?$
$1.$在$dfs$时 ,假设当前$dfs$到的点是$u,$在$u$的儿子中找两个儿子$v_1,v_2$。在$v_1$的线段树下标$(1\sim (w_{u}-1))$范围内找最长的$lis$,在$v_2$的线段树下标$((w_{u}+1)\sim m)$范围内找最长的$lds$,将两者相加并$+1$更新答案$(+1$是为了加上当前点$u),$
$2.$在$dfs$时,还有一种情况没有被算到,就是当前节点$u$的权值$w_{u}$不在答案序列中,由$u$的两棵子树中选取,这种情况需要在线段树合并时更新答案。
$Code$
1 |
|