NOI2017
游戏
-
选 \(a\) 就必须选 \(b\) 这种逻辑语言,事实上就已经很有 2-SAT 的特征了
-
这个 \(d\leq 8\) ,那么考虑枚举每个 \(x\) 的场地类型
-
假设现在确定了所有的场地类型,对于场地 \(A\) ,要么选 \(b\) ,要么选 \(c\) ,对于场地 \(B,C\) 同理
-
那么每个场地有两个选择,对于每个限制条件,假设是选 \(x\) 就必须选 \(y\) ,那么连边 \((x,y)\) 表示选 \(x\) 就必须选择 \(y\) ,连边 \((y',x')\) 表示选了 \(y'\) 就必须选 \(x'\)
-
然后就是 2-SAT 裸题了
总结
-
2-SAT
-
2-SAT 构造方案是选择两个点所在强连通分量的编号中更小的一个点,这不要记错了 (我之前就是记错了)
-
\(d\) 枚举的时候枚举两个就够包含所有的情况了 (我一开始直接枚举 3 个,然后一跑最后一个点跑了 1min 才发现这一点)
-
注意 2-SAT 连边的时候一定要将每一个限制条件换成边连上,尤其是那些比较隐含的限制条件,比如上述点 4 中后面的一条边,我一开始是没有连的,导致出现了问题,所以连边的时候 4 个点都要考虑一下能选择的方案是否有限制
蚯蚓排队
-
字符串匹配问题,而且看起来很暴力,考虑 Hash
-
思路还是很好想的,注意到 \(t\leq 50\) ,我一开始以为复杂度为 \(O(nk^2+|S|)\)
-
注意到 \(c\leq 1000\) ,一开始还以为是对于分裂特殊处理
-
但是我觉得上面那个复杂度可以跑过去,这个 \(c\) 完全没用
-
其实上面那个复杂度加上常数可能就跑不过去了,思路还是那个思路,这个 \(c\) 其实是帮助我们分析复杂度的
-
因为合并的有用子段为 \(O(nk)\),所以总的复杂度其实是 \(O(nk+ck^2+|S|)\)
-
注意这个题因为数据量的问题,自带卡单哈希,所以要用自然溢出或多哈希
总结
-
Hash
-
这个题还是很好想的