元旦三侠的游戏
from keavil
算法一
对于第一个测试点,我们有
显然,无论我们增加
算法二
这是一个博弈问题。我们考虑用
然后我们就可以用记忆化搜索来转移了。注意到
算法三
注意到,对于一个
而如果一个状态
那么,我们的状态数就只有:
复杂度:
元旦激光炮
from vfleaking
元旦快乐!送给大家一道交互式的水题当元旦礼物!
算法一
我们可以用
可以通过 1 号测试点获得 10 分。
算法二
显然可以二分答案嘛!二分第
在长度为
可以拿到每个测试点的
如果你特判掉了 1 号测试点使用暴力,那么可以拿到 1 号测试点的
算法三
注意到有三个超良心的测试点,其中一个数组是空的,只有两个数组。我们可以假想这两个数组的长度为
现在手上有两个数组
我们比较一下
到 均比 到 要小,这说明 中有 个元素, 中有 个元素比他们大,总共 个元素比他们大。- 另一方面,这说明
中有 个元素, 中有 个元素比 到 要小,总共 个元素比他们小。
所以,我们可以去掉
这样只用
结合算法二可以获得 72 分。如果再结合算法一可以获得 76 分。
算法四
当我知道有个算法三的时候我惊呆了……其实我想表演的是另一个神奇的算法。
首先我们把数组的长度扔进垃圾桶!我们想象数组是无穷长的,即在原数组后面补无穷个无穷大。
然后我们取
那么我们看看最多有多少个数比
于是我们可以甩掉
对于
可以通过所有测试点获得
考试时有一些人想到了这个算法,但是你们基本萌萌哒把边界写残了?只有感动中国人物 liuzurang AC啦~我觉得我的样例给得不弱啊……反正我是用同一个数据生成器生成的……
追击圣诞老人
from wangyisong1996
题目大意
给一棵树,每个点有权值
对于第
一个长度为
求权值前
算法一
暴力枚举所有长度不超过
算法二
定义
我们把所有序列建成一张图,每一个序列向它最后加一个点形成的序列连边。
那么这张图满足堆性质:如果
用一个优先队列维护已经扩展到的点(序列)。
一开始将所有入度为0的点(长度为1的序列)放入优先队列里,
然后进行
注意这张图不需要完全建出,只要在访问到
由于一个点会连向
见 http://uoj.ac/submission/4503
算法三
对于上一个算法中图上的每个点,将它的所有出边按权值从小到大排序,
那么就可以用左儿子右兄弟的方法将度数减少为2,这样优先队列中只会被放入
由于一个序列最后能加的点只跟这个序列的最后一个点有关, 所以只要将每个点能走到的所有点按权值排序即可。
时间复杂度
见 http://uoj.ac/submission/4504
算法四
上一个算法的瓶颈是将每个点能走到的点按权值排序。
我们可以将每个点能走到的点按权值建一个小根堆, 优先队列中记录这些信息:(权值, 最后一个点, 指向一个堆的指针)。
弹出一个序列
其中
现在问题转化成,对每个
我们用可并堆(如左偏树)预处理第
时间复杂度
见 http://uoj.ac/submission/4505
算法五
考虑算法三,
如果我们能在
算法三中
我们用主席树(可持久化线段树前缀和)来维护
于是总的时间复杂度为
能通过1
见 http://uoj.ac/submission/4506
算法六
考虑算法四,
对于一条链
我们用一个二元组
复杂度为
用 倍增 or LCT or 树链剖分(要预处理每条重链的前缀
那么时间复杂度就是
如果你用倍增,空间复杂度是
如果你用LCT,空间复杂度是
用树链剖分就可以通过所有测试点了。