P10241 [THUSC 2021] 白兰地厅的西瓜
考虑 DP,注意到一个简单路径可以被拆为向上的部分和向下的部分。所以设 \(f_{u,i}\) 表示 \(u\) 的子树中从 \(u\) 向下且第一项是 \(i\) 的 LIS 的最大长度,\(g_{u,i}\) 表示 \(u\) 的子树中 \(u\) 的某个子孙向上到 \(u\) 且最后一项是 \(i\) 的 LIS 的最大长度。
从 \(u\) 到父亲 \(fa\),转移考虑将 \(a_{fa}\) 作为 LIS 的开头或结尾:
\(\max_{i=a_{fa}+1}^nf_{u,i}+1\to f_{fa,a_{fa}}\)
\(\max_{i=1}^{a_{fa}-1}g_{u,i}+1\to g_{fa,a_{fa}}\)
于是可以对每个节点用线段树维护 \(f\) 和 \(g\),从 \(u\) 转移到 \(fa\) 只需要先将 \(u\) 的线段树用上面的转移方程进行修改,再直接合并到 \(fa\) 的线段树上即可。统计答案时,考虑在合并 \(u\) 之前 (此时 \(fa\) 的线段树维护的线段树维护的是只考虑从前几个儿子上来的 LIS 时的 \(f\) 与 \(g\))更新答案,有 \(f_{u,i}+\max_{j<i}g_{fa,j}\to ans\),
\(g_{fa,i}+\max_{j<i}g_{u,j}\to ans\)。实际实现时,同时从\(u\)和\(fa\)的线段树向下走,每次用
\(\max f_{lson[fa]}+\max g_{rson[u]}\)更新答案即可,这是经典的线段树合并套路。

浙公网安备 33010602011771号