石子合并
idea, data, solution from myee
萌萌出题人给大家带来了一道萌萌签到题!
,
直接
注意处理相同元素时不要计重。
,
做法同上,但是 check 部分的常数要写的好一点。
, ,
对于
我们不妨考虑 dp,从小到大依次加入石子。
每次加入一段相同的石子时,我们可以选择给已有的石堆往末尾分别加入若干,或者加入某些还没有出现过的石堆。
dp 时需要记录当前已经考虑到哪个石子,以及已经有多少个石堆已经非空了。
复杂度容易做到
, ,
现在有下降的石子编号了,我们咋办?
我们考虑一下归并的过程:如果第一个石堆里的某个石子 x 后面有一堆比当前石子小的石子,那么当合并时加入 x 后,x 后面一堆编号比 x 小的石子会跟着一起加入,而且仍然保持跟在 x 后面。
因此,我们可以把这些 x 后面比 x 小的石子“归附”到 x 上,容易发现合并过程是不变的!
对于最后合成的序列,当一个石子比前面的任意某个石子小的时候,其一定归附在前面的某个石子上,因此删除其不影响答案!
这样我们就转化成了石子编号不降的情况,直接采用
,
同样我们只考虑
之前我们的 dp 没有前途,考虑有没有什么比较优秀的做法。
我们观察到,之前的做法复杂度比较高是因为题目里这个「非空」的限制很棘手。
如果没有这个非空的限制,那我们怎么计数呢?
我们假设有
理由是显然的:只用对每种编号的石子考虑插板法即可。
然而答案要求每个石堆均非空,我们设这样的答案为
我们尝试考察
理由是,我们可以枚举当前哪些石堆是非空的,而剩下的石堆都是空的。
那么很自然的考虑二项式反演(不会?可以去 vfk 的博客里学):
因此我们只用求出
直接按照第一个公式暴力处理就是
,
我们发现问题的关键在于要快速算出
我们考虑观察一下特殊性质。
特殊性质:
这种情况下我们只用枚举
特殊性质:
我们考虑到对于同样的
那么我们就有
直接处理即可。
一般情况
实际上有多少
我们注意到
因此实际上满足
直接暴力计算所有
总复杂度
快速幂的 去哪了
那肯定有同学要问了:快速幂部分的
其实是因为,我们计算
而
而我们显然有
因此
从而计算
一个更优的做法
我们考虑到
因此问题的关键在于对
使用多项式多点求值算法或者多项式连续点值平移可以直接做到
能不能再给力点啊?
我们注意到
很显然我们有
这就是一个差卷积的形式,使用 MTT 即可在
问题来到计算
总复杂度不会超过
街头庆典
idea, data from 1kri, solution from 1kri, zhoukangyang
分析
考虑找到一组割掉边数最少的最优解,去分析这种最优解的结构。在这组最优解中,每条割掉的边都是不能省去的。
那么对于每条被割掉的边,它的两个端点一定是所在连通块中某条直径的端点。否则如果不割掉这条边,直径长度和也不会变大。
进一步分析,对于一个连通块,找到它的中心(直径的中点,有可能在某条边中间),那么它外围的所有端点(除了原树中的叶子节点)与这个中心的距离一定相等。换言之,每个连通块都恰包含了到某个中心距离不超过一个定值的所有节点。
我们考虑以某个原树的直径端点为根,这时我们发现,对于最终的每个连通块,都有一条直径以其深度最浅的点为端点。
算法一
以某个直径端点为根。
考虑
我们记
对于
对于三种情况,都容易写出
以第三种情况为例,
直接转移,时间复杂度
算法二
我们对树进行长链剖分,对于每条长链同时处理答案。
假设现在处理的是包括根的长链,对于其余长链都已计算得到答案。
考虑一种特殊的情况,这条长链上的点所在的所有连通块的中心都在长链上。不难发现,这个限制等价于每个连通块都有直径完全在长链上。
我们设
改令
我们从大往小处理每个
当
又由于每条长链下挂的短子树最大深度和是
对于每次
长剖维护
然而这个算法是建立在只处理包括根的长链且这条长链上的点所在的所有连通块的中心都在长链上的假设上的,无法获得什么分数。
算法三
还是考虑只处理包括根的长链,而允许长链上的点所在的连通块的中心在短子树内(或下挂短子树的边中)。
再重新考虑算法一中的
而这里不能直接长链剖分,是因为当中心在长链上时,第一、二种转移需要数组对位取
而对于只考虑连通块中心在每条长链下挂的短子树内(或连接其的边上)时,就可以规避掉影响时间复杂度的部分了。
发现长链剖分可以解决所有中心不在长链上的转移,而算法二中的扫描线可以解决所有中心在长链上的转移,这两部分拼在一起就得到了所有可能的转移!
那么我们直接同时施加两种方法,就可以得到所有正确的
这个算法只考虑了处理包括根的长链的情况,而没有考虑对于其它长链怎么计算
算法四
现在唯一的问题是要求出
我们假设长链上的节点是从
那么我们发现,
唯一的区别是,
这样,我们通过类似求
这时,我们的算法不建立在任何假设之上,可以以
更进一步,发现线段树的部分是可以由并查集替代的,就能做到
由于时间限制十分宽裕,只要复杂度正确的做法都能通过。如果不会写复杂的长剖,甚至可以全部用线段树和线段树合并替代。
铁轨回收
idea, data, solution from zhoukangyang
算法 1
我会观察数据范围!
发现有
算法 2
我会暴力!
模拟题意,时间复杂度
算法 3
从前到后 DP,记录一个长度为
期望得分
算法 4
留给实现得不好的正解。
而 Melania 同学用厉害 DP 过掉了
期望得分
算法 5
在后面的描述中,我们记题面里的
假设第
我们考虑统计执行完
- 对于
,我们只要统计 的方案数即可。 - 对于
,我们用总方案数减去 的方案数。
这样,我们可以枚举答案
记
转移可以考虑以下几种情况:
为那 个点中的一个,此时 。- 统计
,并选择”统计总方案数“:此时 ,并选择 中的一个元素减去 。 - 统计
,并选择”减去 的方案“,即做 的贡献。此时选择 中的一个元素减去 ,然后在 中加入一个 的 。 - 统计
的贡献。此时选择 中的一个元素减去 ,然后在 中加入 。
注意到
我们再把 DP 倒过来做(或者说,转置原理),就可以用一遍 DP 求出答案了。
预处理一下状态之间的转移,时间复杂度上界为