由于撞上冬令营以及一些管理员们的个人原因,这次的准备时间非常仓促,即使管理员考前熬了几次夜也难以称得上进行了充分的准备,C 题和 E 题还发生了暴力通过的事故,先在此表示道歉!
新年的饮食方案
Idea, data, std from MatKave, solution from rushcheyo
良心送温暖大水题~
算法一
题目要最小化最大值,不妨二分答案,下面判断答案
显然第
具体的,我们考虑左端点最小的区间
复杂度
算法二
咦上面的算法中二分答案好像没啥用?直接去掉就好了!复杂度
具体地,上面每次二分的过程中,左端点排序的结果并没有变,左端点相同时由于右端点都加了
新年的密码锁
Idea, solution from rushcheyo, data, std from skip2004
算法一
首先要做一步 easy 的转化:
- 存在两条链都不连通当且仅当存在一条边不被任意一条链经过,而且两边都有链。
充分性是显然的,必要性考虑反证:任意两条路径都是连通的。这也是显然的,我们在两条路径上各取一个点,把这两个点树上路径每条边都随便取一条链,就整出了一条路径。
那么给定
算法二
下面就要用数据结构维护了。
先考虑链的情况,我们可以直接对每条边维护:子树内的链数
上树的话,我们发现每次是对
算法三
上面这个做法好难写啊!注意为了选手和出题人身体健康本题只有加入操作,每条边的状态(子树内有链,子树外有链)只会变化
算法四
上面这个做法还是好难写啊!注意问题是离线的,考虑倒着做,每次删掉一条链。我们称一条边的贡献是覆盖它的链的权值和。考虑这条链经过的贡献最小的边,如果这条边合法而且等于之前的答案,那么本次选这条边就是答案;如果这条边不合法,以后更不可能合法,将其贡献改为
新年的聚会
本题大家纷纷通过了,但是有几位选手可以证明甚至是相信自己算法的时间复杂度呢?
Idea, data, std from skip2004, solution from mayaohua
算法一
题意其实就是给一个
一个暴力的想法是依次枚举所有点对
询问次数和点集大小和都是
算法二
考虑一个剥独立集的做法:每次从图中删去一个极大的独立集(剩余点均和这个独立集中点有边),然后递归还原剩下的子图,再还原独立集中的点和不在独立集中的点间所有边。寻找独立集的时候只需要依次加入每个点,询问现在的极大独立集加上这个点后是否仍为独立集。还原边时,可以枚举不在独立集中的每个点,尝试二分出它和该独立集间的所有边。
不算还原边的部分询问次数为
不算还原边的部分点集大小和为
期望得分
算法三
初始时随机打乱所有点。
考虑一个分治算法,每次尝试还原出点集
首先将
随后我们枚举
考虑分析这个算法。
首先分析询问次数。
第一部分枚举每个独立集对间寻找它们的并集是否是独立集,这至多询问
第二部分分治寻找边,容易看出若找到了
那么整个算法的询问次数就是
接着分析点集大小和。
第一部分枚举每个独立集对间寻找它们的并集是否是独立集。由于两侧都只有
引理 1:
证明:考虑所有
那么由于初始时我们打乱了点集,容易分析出第一部分期望点集大小和为
如果不采用随机化,视实现不同分别可以卡到
第二部分分治寻找边。
引理 2:对于
证明:由拉格朗日乘数法,容易得到当
引理 3:在一对大小为
证明:分治寻找边的树形结构可以认为是一棵四叉树,其中第
那么考虑某一层,由于我们将
那么第二部分点集大小和就是
那么整个算法的期望点集大小和就是
期望得分
算法四
我们也可以给出一个渐进意义下相同的确定性算法。
考虑将分治的过程改为合并,令一个点集
由于每个点被连续合并两次后,所在点集权值至少加倍,而点集总权值是
期望得分
算法 X
由于数据范围问题,各种复杂度不一的算法均可能可以通过。
新年的军队
Idea, data, std, solution from EntropyIncreaser
简明题意
对于全体满足
算法一
使用著名的 next_permutation
枚举所有排列。
期望得分
算法二
我们考虑 DP,设
时间复杂度
问题转化
为了方便刻画排列的性质,我们首先需要将问题进行适当的变换。考虑将问题进行下述改写:
对于全体满足
由对称性可知,按照
那么我们在考察其中一个特定实数的分布的时候,用类似概率密度函数的工具来刻画是较为恰当的。如果一个
转化为概率密度的好处在于,我们可以轻松地刻画问题中出现的约束关系,设原先的概率密度函数为
- 添加实数
要求其 ,那么新的关于 的概率密度无非就是 。 - 对称地,若要求
,那么新的关于 的概率密度就是 。 - 又有实数
关于 的概率密度 ,增添要求 ,此时 的概率密度函数就是 。
注意到概率密度函数也是个多项式,设原排列中
算法三
设
我们接下来让
我们发现对于
复杂度
算法四
插出点值这个过程其实并不是那么必要,我们考虑怎么直接计算系数。首先观察我们所求的和式
一个常数小的计算
虽然数据范围是
算法五
这是一种与算法四殊途同归的推导。我们先不急着提取系数,考虑将两边的总变数写成
新年的挑战
Idea from rushcheyo
Checker 有两版,分别由 rushcheyo 和 vfleaking 完成
Task 1, 3: std, solution from rushcheyo
Task 2: std, solution from skip2004
本题准备时间实在太短,主要的精力都花在搭建嘿嘿计算机上了,题目本身内容不是很有趣,再道歉一次。
任务一:排序
由于时间仓促,我没实现任意一种暴力。从比赛现场来看,堆排序和归并排序都可以拿到一定的分数。在此基础上和其他任务一样把分治叉数增大到
std 的做法是,首先将数组随机 shuffle,然后一个一个把元素插进最 naive 的 BST,最后先序遍历 BST 即可。每次插入的时候要找到插入位置,需要
任务二:维护前缀和
首先如果我们不知道下标是多少,我们只能在内部实现数据结构,这是很低效的,需要大量的判断语句,因此我们考虑把下标转移到外部。
我们可以用好多好多 CMP
下标和 JMP
来把程序分成
然后使用树状数组来进行维护,我们求出已知下标时需要访问的位置,直接实现即可。
但是由于修改复杂度较高,所以我们可以把树状数组的叉数提高至
事实上,这里层数不大,类似于分块,而分块有这样一种常数优化的技巧:询问一个块内区间信息,用大块信息减去其余信息来求解它。
我们记
这里 std 选用了
任务三:多项式乘法
算法一
这不是裸的 FFT 吗?容我抄个 FFT 板子,改成 hei++
语言,一发 AC!出题人可真 sb。
本题的指令集中间进行了一次大更换,在迁移老版 std 时我忘记了寄存器数量达到了
算法二
与任务二中的思想类似,我们将 FFT 的叉数增大到
这样的做法时间复杂度是
然后和经典的 FFT 类似,我们可以在