题意
作为瑞瓦肖57分局最优秀的警探,你被派到马丁内斯打击犯罪。马丁内斯的一些建筑物上安装了 m m m个摄像头。你明白,普通人并不会因此受到多少保护,这些摄像头是保护*资本主义*的。作为一个信仰共产主义的战士,你决定滥用职权,拆掉一些摄像头。马丁内斯的街道是一棵 n n n个点的有根树,每个点是一个商店,豪宅之类的重要建筑物,建筑物之间的边就是街道,一个摄像头可以监控子树中所有和它的距离 ≤ d i \leq d_i ≤di的建筑物。拆一个摄像头是不小的劳动,会减少 c i c_i ci的快乐度。而一个毫无监视的重要建筑物会给予你 v i v_i vi的快乐度。你想知道,你最大能获得多少快乐度。
1 ≤ f i < i 1\leq f_i<i 1≤fi<i
1 ≤ x i ≤ n 1\leq x_i\leq n 1≤xi≤n
0 ≤ d i ≤ n 0\leq d_i\leq n 0≤di≤n
1 ≤ c i , v i ≤ 1 0 9 1 \leq c_i,v_i\leq10^9 1≤ci,vi≤109
n , m ≤ 5 × 1 0 5 n,m\leq5\times10^5 n,m≤5×105
数据点 | n,m | 性质 |
---|---|---|
1,2 | ≤ 20 \leq 20 ≤20 | |
3,4,5,6 | ≤ 200 \leq 200 ≤200 | |
7,8,9 | ≤ 3000 \leq 3000 ≤3000 | |
10,11 | ≤ 4 × 1 0 4 \leq 4\times10^4 ≤4×104 | d i ≤ 20 d_i\leq20 di≤20 |
12,13,14,15,16 | $ \leq 10^5$ | |
17,18,19,20 |
题解
原本只会DP,设 f [ u ] [ i ] f[u][i] f[u][i]为 u u u子树内前 i i i层不考虑的最大价值,对于 u u u的子树,枚举一个距离之外的监控被拆除,加上子树的DP值,效率 O ( ∑ d e p i ) O(\sum_{}{dep_i}) O(∑depi)。但这个DP用长剖或线段树合并都难以优化,有一种比较大力的拆开分讨+线段树合并的做法,但显然不太适合我。
“这不就是模拟费用流板子吗”——slz
发现这有一个比较显然的最小割建图,先取所有点权,把起点与监控连监控价值的边,树上节点与终点连点权的边,有控制关系的监控和树上节点连正无穷的边,跑最大流减掉即可。考虑如何使流量最大,按照从后代到祖先的关系考虑每一个监控,那么该监控肯定要从有连边的节点中深度最大的开始选要选取,于是直接dfs时维护子树内以深度为下标的残余流量的线段树,在每个节点上计算答案并合并子树点的线段树即可。