比赛日志
中规中矩的一场模拟赛。
T1 写得实在是太久了……这也是没办法的事情——如果不对转移作压缩优化就没办法过。
T2 有我喜欢的马拉车 Manacher 算法,是印象里第二次在模拟赛应用。
然后就没时间了。后两题仍然只有暴力分,但最近频繁遇到跟凸包和线性函数相关的题目,这使我发现 T3 跟它相关。在最后一点时间里实现了构建凸包的函数。代码本身没问题,但思路是错误的。
简略题解
A – 石蒜反冲
这好像是很早以前的译名了。现在它叫《莉可丽丝》。
遇见多模式串匹配,自然想到自动机上 DP。但我们发现题目中给定的两个串 sakana
chinanago
在任何一个文本串中最多只能匹配其中一个,且匹配位置唯一。于是简单计数 DP 转移,记录当前二者匹配数之差与目前匹配位置即可。
一些不应用就过不了的优化:
- 二者数量之差可只记录到 。 是两个串的总长度。
- 转移时对于
?
s
c
a
o
还有其他字符分类讨论,保证单次转移复杂度为 。
时间复杂度 。 (更多…)
感冒咳嗽,头实在是太晕了,打完前两题和后两题的暴力之后跑去睡了会觉。结果考得还行。
一句话题解
A – 破坏
简单的 DP。记录每个节点的路径数奇偶性考虑是否翻转即可。
B – 共识
用 std::bitset
写的暴力大家都会。不过如果你胆子大些,不判断是否为部分分数据范围直接提交(加入随机化的)暴力,将喜提 。
命题:现有一个由 个元素构成的集合,保证 。有 个大小恰为 的子集 。则至少存在 对无序对 ,使得 。
证明(引自宋佳兴学长):记元素 在所有子集中出现的次数为 。则显然有“所有子集两两之交的大小”
考虑计算该式最小为何。不妨先考虑 在何时取最小值。
引理: 在 处取最小值。
恕我语文不好,实在不晓得用何种词汇来描述看到下文的感受:
此比赛为正常的提高组难度,
甚至可以用来作为普及组模拟赛。 请选手 AK 后不要大声喧哗,以免影响他人 AK。
尤其是这套题的出题人是张隽铠的情况下。当然,OI 圈风气本就如此,我也不好过多评价。No comment.
T1 还算顺利,半小时左右搞定。T2 是大分类讨论,足够恶心人,但好在有相当可观的可以通过暴力与观察拿到的部分分。T3 猜测与线性基相关,但没有相应知识储备,暴力跑路。
T4 就……反正出题人开心就好。到现在都没人改出来。
一句话题解
A – 序列
依次往某个子序列中添加元素。则添加的元素必然成为新的最大值/最小值之一,否则违背题意。
于是枚举子序列首元素,将以其开头的严格上升子序列数与严格下降子序列数相乘即可。使用树状数组转移即可。复杂度 。 (更多…)