模拟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)$。

 

posted @ 2019-08-11 14:13  skyh  阅读(173)  评论(0编辑  收藏  举报