小火车
idea from 神秘人, data, solution from hehezhou
算法一
我会按照题意模拟!
直接枚举
时间复杂度
算法二
我会 meet in middle!
把所有数均匀分成两半,分别对两侧求出填上
考虑找出将两侧合并出
时间复杂度
算法三
我们还没用到
题意等价于找出两个不相交的子集,使得集合元素和相等。这又等价于找出两个不相同的子集,使得集合元素和相等,后者到前者只需删去两个集合的公共元素即可。
那么这和
直接搜出所有子集和,找到两个相同的即可。
时间复杂度
算法四
对于数据随机的部分,算法二和算法三简单改造以后都可以通过,背后的理论是生日碰撞。
对于算法二,在两侧随机
时间复杂度
算法五
我们从鸽巢原理入手。
假想有
那么
更近一步,对于一个桶的区间
令桶区间
如果
因此,我们只需要能快速计算
而计算
定位到某个目标桶后,同样使用 meet in middle 找到对应子集即可。
时间复杂度
题外话
其实这道题是一篇论文的子问题。但是原论文中的做法比算法五复杂许多。
这题数据实在太难造啦!
造题人想破头只想出来一个构造:
给定
,令 。先令
,再随机取 使 特殊的变为 。随机打乱,随机将一些数变为相反数。
随机取
满足 与 互质,将所有 变为 。
这个构造的答案只有两组,是理论最低值。那么聪明的大家能否找到其他的构造方式呢?
神隐
idea from skip2004, data from skip2004, solution from skip2004, skyline
这题其实给出每条边的编号也是简单的,但是略微增加代码难度,就去了。
算法一
我们直接进行
询问次数
算法二
如果一个询问包含一条边,那么这条边两边的点就会在一个连通块中,不然就不在。
考虑进行如下
考虑两个点,如果恰好出现在其中
如果使用暴力的实现,时间复杂度为
如果使用精细的实现(类似于算法四),时间复杂度为
算法三
from p_b_p_b
对于任意两条相邻的边:
必须有询问只有第一条边没有第二条边,且有询问只有第二条边没有第一条边。
不然容易构造多种情况询问结果相同。
算法二显然是满足的,但是询问次数过多,我们可以使用以下方法:
选取
其余部分和算法二相同。
如果使用暴力的实现,询问次数为
算法四
from skyline
注意到边是所有
solve(当前限制下连通块交, 当前已经处理的询问轮数, 当前已经被要求强制在一个连通块里的轮数)
如果点集大小是
如果当前已经被要求强制在一个连通块里的轮数达到
如果不强制此轮在一个连通块里仍然可能最后
如果强制此轮在一个连通块里,我们使用时间戳+类似基数排序的手段来关于连通块交大小线性地对连通块做出划分并进入下一层搜索
我们下面将证明上面的策略是 solve(any, x, y)
的边数是
算法五
考虑一个点什么时候是叶子,就是他度数为一,此时其在一半询问中单独一个点为连通块。
而删叶子是很简单的事情,因此我们可以一个个剥叶子。
剥完叶子我们开始反着加,此时考虑一个点的父亲是谁。
一个点在另外一半不是孤立点时候的询问所在的连通块,一定包含了它的父亲。也容易说明这些连通块的交集中只有它的父亲。
此时只要做树上
时间复杂度
结合算法二,可以通过子任务
结合算法三,可以通过本题。
Border 的第五种求法
idea, data, solution from he_____he
出题人在此谢罪。被意料之外的简单做法过了。
算法 1
简单清新
算法 2
A 性质有什么用?可以发现,对两个不同位置,长度大于
算法 3
要不,猜个结论?众所周知,一个区间的 border 能被分成
算法 4
重新观察 border 的性质,我们回到最初的起点:找到所有
考虑该题中提到的 DAG 剖分,我们可以把链分成若干段重链上的区间。现在问题就相当于:每个 SAM 节点在 DAG 结构上有一个标号,有一个权值
题外话
本题说明,我们能够将一个区间中所有 border 的信息定位到 SAM 节点上,相较于基本子串字典,我们虽然没有得到 border group 的表示,但我们得到了另一个角度的信息。或许我们以后能获得更有价值的信息?