Atcoder abc311
https://atcoder.jp/contests/abc311/tasks/abc311_h
Ex - Many Illumination Plans
N点,根为1,树
点有b[i],w[i],c[i]=0/1
Q(v) =
$\max \sum b_i, i\in U$ ,其中U是,v的子树U, 任意多次 删除点 并将子点和父节点相连
, 最终满足$\sum w_i \le X$ 且 所有边的端点的c不同
求$Q(1),Q(2),…,Q(N)$
n 200
$X \in [0,50000]$
$W_i \in [0,X]$
$B_i\in [0,10^{15}]$
3s
1024mb
我的思路
先考虑其中一次的问题求解,
也就是给定一个有 点b[i],w[i],c[i]=0/1
的树
然后删除点,让sum b尽量大,且满足 颜色 和w和的条件
dp[v] = w->b
保留v, v以下的和为w, 能得到的最大b
根据限制 传递时 只和 w与v的颜色有关
这样的问题是,要转移的话,每个v需要的就是所有后继不同色的点,并且还要考虑 后继点的关系
改一改
dp[v][c] = map<> w->b
v或以下对上颜色贡献为c 和为w, 能得到的最大b
这样就是3个分支
- 选择v,
w[v]
+dp[u][c[w]^1]
的合并 - 不选择v,颜色=0 的
dp[u][0]
的合并 - 不选择y,颜色=1 的
dp[u][1]
的合并
状态数 $O(n X)$ ,但转移代价似乎有点大,可以启发式合并吗?
然后启发式合并的一点是 每次会有一个很大的状态是不变的,每次把新增的相对小的状态向大的状态里塞,而这里每次选择v的话,可能有一个大的偏移
而且如果w是1,2,4,8,这样的话,只需要16个,2^16=65536 就可以让状态是满的
一个想法是 能不能 强制 让 b随着w单调递增,这样即可以让状态是连续的,又可以保证非严格单调递增
用更小的w 对应更大的b 去覆盖了更大的b, 如果这样的到了答案,那么对应选择的w一定是大与等于 实际的w的,不会不合法?
那如果有最优方案,关心对应的同样的w,如果被其它覆盖了,那么b一定更大,且有对应的合法w方案
这样的话 每个 dp[v][c] =
一个非严格单调递增的数组w2b
需要合并n次? 如何高效的合并? merge(A,B) = C, C[i] = max(A[j]+B[i-j],j=0..i)
单调递增也保证不了 变化程度