[BZOJ4712]洪水(树链剖分+DP)
题意 给一颗点带权的树,删除一个点需要花费对应的代价,每次询问一颗子树,求最小代价,使得子树的根到不了子树中的任何叶子,支持将单点的权值增加一个正值 思路 设 \(f[i]\) 表示i子树的答案,h[i]表示i的所有儿子的f和,w[i]表示i的权值,不难列出状态转移方程: f[i]=min(w[i],h[i]) 如果i是叶子,就将它的h赋成正无穷,可以避免一些讨论 对于修改操作,由于w只会增加,所以各个数组的值都不会减少 一个显然的情况是,如果一个点的f值已经等于w,那么无论它的h怎么增加,它的f值是不会变的(除非修改它的w) 设修改过程中的某个点的f值变化了delta,我们将该点对祖先的影响分为四种情况(设该点为i,父亲为fa) \(delta=0\) ,那么它的祖先不会变,break(其实和2差不多) \(f[fa]==w[fa]\) ,即修改它的h值对f没有影响,h[fa]+=delta,delta=0,下一步就会break掉 \(w[fa]>h[fa],w[fa]>h[fa]+delta\) ,即加了delta之后,f[fa]也会加delta \(w[fa]>f[fa],w[fa]\leq h[fa]+delta\) ,即加了delta之后,f[fa]就变为w[fa] 用树链剖分维护min(w-h),h,对于修改操作,找到最上面的满足3的点,将这一段路径的h值加delta