模拟17 题解
A. 入阵曲
求每一行的前缀和,
枚举左右端点,O(n)扫下去,顺便更新桶。
维护栈清空桶中的内容。
B. 将军令
k=1,小胖守皇宫弱化版。
与小胖守皇宫比较,发现特殊性质:
点没有权值。
考虑贪心。
每次找出深度最深的点,点亮它的k级父亲。
1.点亮k级父亲比点亮它的任何一个儿子更优,因为能更多的覆盖到该子树外的节点。
2.点亮k级父亲子树以外的点,不能覆盖到深度最深的点。
综上,该贪心策略是正确的。
考试时想到了这个贪心策略,
然而受小胖守皇宫限制,固执地认为贪心一定不成立。
那道题已经做过去很久,已经忘记了差异点。
其实可以尝试一下贪心,打个对拍的。
C. 星空
区间翻转的修改很大,难处理。
考虑如何将区间修改为单点。
差分即可。
设$a_i$表示第$i$盏灯的初始状态,1为灭,0为亮。
设$b_i=a_i$^$a_{i+1}$,显然b的前缀和表示单点的a值。
将区间修改$(l,r)$转化为单点修改$l-1$和$r$,将两个值取反就达到了区间修改的效果。
要求的最终状态是b数列全为0。
将两个0取反为1是没有意义的。
有意义的移动是将一个1不断与0取反,直到两个1共同取反为0。
bfs处理出一些1之间的路径,对不超过2k个1之间进行状压。
复杂度为$O(2^{2k}*k^2+nmk)$
然而dp转移有一些冗余。
固定一个转移的顺序可以达到优化的效果。
每次转移第一个1,复杂度为$O(2^{2k}*k+nmk)$。