剪枝技巧
这道题的剪枝技巧非常的精巧,有很多的技巧可以在做题中良好的运用。我先把代码贴出,然后我们再来分析。
这道题用的方式非常之神仙,用位运算来判断数字的选与不选。首先我们先来构造几个辅助数组,以便把映射数组\(X,Y,Box\)的值预先求出,然后再处理几个位运算的辅助数组。由于做法过于神仙,难以解释,看代码就好。
其实这道题就是在求一个序列中最多\(M\)个(可相互重叠的)子序列的最大和。我们可以把序列中连续的正数和负数全部合并在一起:正数和正数合并,负数和负数合并。然后我把所有的正数全部加入答案之中,以他们的绝对值为关键字放入小根堆中,并且计个数,与此同时再创建双向链表结构。之后,我们可以以\(cnt>m\)作为循环条件,不停的取出队中的元素来进行处理。
我们可以考虑一个神仙结构:对顶堆。创建大根堆\(qmax\)和小根堆\(qmin\)。我们先用数组来储存这些数据。然后针对于某一次询问,我们要找整个序列前\(u(i)\)个数中第\(i\)小的的数字。每一次询问时,我们都把前\(u(i)\)个数放入大根堆中,如果大根堆中的元素数量等于\(i\)时,我们就把大根堆中最大的数(堆顶)放入小根堆中。最后,大根堆的元素个数为\(i-1\),然后我们要找的第\(i\)小的一定在小根堆的堆顶。
这道题的题意就是求能平铺成原矩阵的最小子矩阵。我们可以使用 KMP 的方法来解决这个问题。首先我们需要找出周期矩阵的横向长度,我们可以用朴素的匹配搞定这个:
这个月我完成了我人生中的第一次正式的 OI 比赛 – NOIp。虽然结果令人心痛,但是也只能怪自己能力不足,比赛经验贫乏罢了。FZOI 2017 的巨佬们考得很好,XG 的江西第二很稳定,DOFY 的最后一次 NOIp 照样是虐场的存在。这个月学会了调整情绪,调整自己的状态。我非常感谢机房的巨佬们,还有对雷老师在我情绪崩坏之后对我的关心,我也是非常感激的。我目前感觉状态很好,即使文化课的问题开始愈发暴露。
这个月多多少少也学了一些算法,多亏了 crazydave 送我的那本《算法竞赛进阶指南》我才能得以系统性的学习 OI 算法。Trie 树、KMP 模式匹配、单调队列和单调栈、Hash 算法…学的很少,听说省内的一位高一巨佬在全省 rank 10 内,也只能自愧不如了。
12 月份开始了,让我在 2018 的最后几周好好的改进我的 OI 水平吧。