Atcoder abc319
https://atcoder.jp/contests/abc319
F - Fighter Takahashi
根1,n点 树
非根节点, 2种类型, (si,gi) 或 ((gi) 最多10个)
1 | 初始 s=1 在根 |
问 能不能经过所有 (si,gi)
n 500
si [1,1e9]
gi [1,1e9]
第二种类型最多10个
2s
1024mb
这不是手机广告里看到的游戏吗 哈哈哈哈哈哈哈
我的思路
这10个,和 n <= 500
我的感觉就是 bitmask乱搞一下?
dp[bitmask] = 恰好把bitmask的 (gi)类型点走完
的最大s
因为所有操作都是增长s的
所以一旦s > max(si)以后,就都可达了
那么对于 (s+w)*v
和(s*v+w)
肯定先加会更好
所以步骤是
- 当前bitmask,尽量+
- 完成加以后走一次 (gi)
尽量+因为和当前s有关系,而办法就是所有可达点找最小的si,因为任何其它顺序的方案,对其 (可达性,si)排序,肯定有等价的 先最小可达si的方案,贪心就完了
那么问题来了,bitmask以后的方案似乎对应的点并不一致
因为在 尽量+的时候走过非bitmask的点
那么还剩下树的性质没有用,如何使用呢?
另一个想法就是 别bitmask了,直接 贪心+10! 吧,反正上面总结的是 每次尽量+,之后才走乘法
所以是
- state => 贪心所有可用的+点全部用完
- 那么现在剩余有若干个乘法点,这里直接分叉 暴力: $500\cdot 10!=1814400000$个方案
再一个就是两者结合,当达到bitmask且完成尽量+以后,记录s和对应的树状态
因为bitmask完成 和 + 以后,那么树上的不考虑s的 连通点是一样的,在一样的开放连通点情况下
“感觉上是” s越大越优,因为完成了 尽量+
所以 当前两个方案 如果不同 它们s如果相同,那么可达区域 <= s都可达 也就相同
如果它们 s不同,s更大的 可达区域也越大
所以就是 bfs + 贪心 + 优先队列 + bitmask
?
直接过了