100 + 100 + 0 = 200, 27/53.
T1.让别人修
答案非常小,考虑枚举答案所处的格子。需要做的就是,给你两个集合,判断能否分别抽出一个数使得或起来为给定的数。可以判定转计数,计数就是容斥,实现可以 FMT。时间复杂度 $O(m^2n2^n)$。
发现值相同的格子的计数可以同时进行,于是时间复杂度变为 $O(mn2^n)$。
T2.飞机趁机
可以对每个格子预处理选择哪些格子可以使该格子计入答案,之后相当于每个点选或不选,若选择就需要让其指向一个点,被指向的点需要开商店。
树形 DP,考虑将 $k$ 是否开商店挂在最浅的指向它的点上,$f_{i,j,k}$ 表示考 $i$ 子树的点选或不选,开了 $j$ 个商店,$i$ 指向 $k$,$k$ 未选择。$g_{i,j,k}$ 表示 $k$ 已选择,发现 $g$ 的第三维不重要,然后转移就是树上背包,时间复杂度 $O(n^3)$。
$m=1$ 怎么做?
点分治求出在每个点开商店的价值,时间复杂度 $O(n\log n)$。
T3.偷走零件
总结
- 不会字符串
- 做点树形 DP?