切割冰片
idea, data, solution, std from ix35
在题解中,我们用横光
称一根光束被阻塞,当且仅当它最终没有延申到其最远距离。
算法一
暴力枚举所有
时间复杂度为
期望可以通过子任务 1,获得 15 分。
算法二
我们对该问题做一些基本的观察。
观察
:横光 和纵光 中,一定存在一个没有被阻塞。证明:假设二者都被阻塞,则第一种情况是横光
被纵光 阻塞,那么纵光 就没有被阻塞,矛盾;第二种情况是横光 被纵光 阻塞,纵光 被横光 阻塞,那么横光 和纵光 就会相交且穿过对方,这是不合题意的,矛盾。
据此,我们就可以推得更强的结论:
观察
:可以假定所有横光从上到下依次激活,所有纵光从右到左依次激活,不会漏掉任何一种可能的最终结果。证明:由于横光
和纵光 中存在一个没有被阻塞,所以可以认为那一根光束是第一个被激活的,然后对剩余的光束归纳。
于是我们只需要枚举满足上述规则的方案,当
期望可以通过子任务 1 与子任务 2,获得 30 分。
算法三
我们可以考虑按照激活的顺序进行动态规划。
设
- 如果
,那么横光 即使伸到最远也够不着纵光 ,所以我们可以认为横光 是最后一个被激活的(因为把所有纵光激活的时间移到它前面不影响结果),也就是 ; - 如果
,那么横光 是可能挡住纵光 的,所以最后一个激活的是横光 还是纵光 就是两种不同的情况,也就是 。
初始状态为
直接计算,时间复杂度为
期望可以通过子任务 1 ~ 4,获得 80 分。
算法四
我们需要针对
考虑从
显然
- 这时,我们将所有那些
的 写出,排序后记为 ,那么对于 ,找到最大的 使得 ,就有 ,所以我们可以只关心所有 。 - 而对于
,我们有 ,也就是说 这个序列实际上是由 这个序列做前缀和得到的。
扩展上面这个结果,如果有
再考虑
所以总的时间复杂度为
期望可以通过所有子任务,获得 100 分。
科考工作
idea from JohnVictor; data, solution, std from csy2005; solution2 from 127
算法一
考虑如下做法:如果众数出现至少
我们证明存在一组解,使得选了剩下一个数和这
实际上,我们可以归纳的找出
令第
我们可以很方便的用 set::bitset
来维护每一次加进去的数,也很好根据维护好的数组来逆推答案。时限很松,
为了获得 random_shuffle
大概率能找到一个区间作为解。
算法二
经典的modular subset背包,考虑对于一个当前的 bitset
上就相当于把一个 0/1 串移位与自己作或,而要均摊地找到那些对应位置不同的元素(在模意义下不同的元素是我们要找的元素的两倍),可以发现我们可以使用二分 + hash 来跳过一段完全相同的部分,而动态的修改需要使用一个树状数组来维护hash,于是复杂度为
谢罪环节
今天比赛的B题是来源于 UNR d2t1,经典的数学问题,给出了存在性证明,但是复杂度不够好,需要找到一个构造性的算法。
JV 出这题主要是希望讨论MO中剩余类递推的思想,也就是对于一个集合 S,如果 S 和 S+x 在模素数意义下是相同的,那么 S 必定是全集。从这里很好给出一个配对,然后给出 n^2/w 的背包,这是 JV 投题时给出的做法。
后半部分,如果直接用位运算优化,那么可以获得 90 分。最后的 10 分数据范围较大,主要还是因为我们朴素地想,要出题就尽可能出到最大可能的范围。
由于获得这最后 10 分需要知道一点论文上的解题套路(虽然近期也出现在了其他模拟赛中),所以对于不熟悉这一解题套路的同学来说不太公平。对此我们深表歉意,下次出题时我们会尽量避免这种情况,比如魔改题意使得论文上的结果无法被使用。
企鹅游戏
idea, data, solution, std from Alex_Wei; data2, std2 from djq_cpp, csy2005
算法一
暴力匹配,时间复杂度
期望通过子任务 1,得到 20 分。
算法二
注意到对每个
时间复杂度
期望可以通过子任务 2,获得 20 分。结合算法 1 可以获得 40 分。
算法三
容易证明
因为
建出
期望可以通过子任务 1 与子任务 3,获得 50 分。结合算法 2 可以获得 70 分。
算法四
我们还有另一用于解决子任务 3 的算法:
根号分治,对于串长
同样地,期望可以通过子任务 1 与子任务 3,获得 50 分。结合算法 2 可以获得 70 分。
算法五
结论:每个文本串包含的 不同 单词数之和的级别为
证明:长度超过
也就是说,在 Subtask 3 的做法中,若将重复经过的点去掉,则总共只会遍历
- 将
在 AC 自动机上经过的所有点建出虚树,树形 DP + 暴力枚举。 - 从
在 AC 自动机上经过的每个点向上跳父亲,如果当前点被经过,说明它的祖先一定被经过,退出。这个过程给予所有相关点形成的树的形态,对其做拓扑排序即可。
配合光速幂,时间复杂度
期望可以通过所有子任务,获得 100 分。
Bonus
本题可以做到
对于单次询问,考虑将对应虚树建出,问题形如求一条链上所有单词节点出现
通过上述分析,可知时间复杂度为每个单词在所有文本串中的不同出现次数之和。
如果一个单词的贡献为
设长度为
将
因此时间复杂度为
谢罪环节
出题人没想到有依赖模数性质的
有一位同学写正解被卡常了,还有一位同学
出题人出题时就感觉很难区分
出题人尽自己最大的努力将这两个复杂度已知的所有算法卡满了。出题人的想法是,既然投到了 UER,那就尽量符合 “Easy” 的原则让大家乐呵乐呵。更重要的是借此机会把这个有趣的结论推广给大家,希望大家喜欢!