bzoj3832
题意
\(n\)点\(m\)条边的DAG,求删除一点后最长路径的最小值。
做法
令\(f_i\)为以\(i\)结束的最长路径,\(g_i\)为以\(i\)出发的最长路径
用权值线段树维护这样一个集合:
- 可重
- 删除一个元素,若不存在这个元素则对集合没有影响
令拓扑序为\(a_i\),初始将\(g_i\)加入集合\(S\)
顺序遍历拓扑序\(x=a_i\)
- 将\(f_u+g_x+1((u,x)\in E)\)从\(S\)删除,将\(g_x\)从\(S\)删除
- 查询集合最大值更新答案
- 将\(f_x+g_v+1((x,v)\in E)\)从\(S\)加入
正确性:
不经过该点的路径存在于\(S\)
经过该点的路径不存在于\(S\):这条路径\(x\)前面每个点的贡献都被删掉了,后面的点只存在\(g_i\)的贡献