新年快乐!大家打得开不开心呀!
“一起AK吧”
长度测量鸡
from nneztlk
算法一
直接枚举刻度, 时间复杂度为
算法二
我们需要题目描述中的
枚举排列, 时间复杂度为
算法三
事实上,
记
现在已经知道
所以只需判断
直径拆除鸡
from szy042
算法一
输出一朵花,就像
讲真这样子对于
然而当
期望得分 20
算法二
输出一棵二叉树
(我没什么想说的
期望得分
结合算法一可以得30分
算法三
枚举树,按照题意模拟
找到一个最大的输出
UOJ的评测机很萌,所以能比算法一多十分~
期望得分:30
结合算法二,可以得40分
算法四 开花的金字塔
思考一下一棵树被删除一条长为x的直径之后的情况,我们发现,剩余的连通块中的直径最长为
证明是容易的。考虑这棵树原来的直径
从取整符号可以看出,直径长度是偶数可以让
然后考虑一棵树被删除之后的连通块个数,除了最后一次删除,每多一个连通块,每个点被算入代价的次数显然会减少,于是就启发我们构造一个删除过程中不出现新的连通块的图,与上面的删除直径相联系,我们就可以随手构造一个符合条件的图出来。
将节点数分别为
期望得分:50
结合算法一/三可以得到60
算法五
我们发现算法四还需要结合算法一/三才能获得 60 分,因为算法四没有办法通过
期望得分 100。
啊严谨证明是:用
快乐游戏鸡
from scPointer
算法一
注意到当当前死亡次数不变的时候,整棵树上可走的点和边也是不变的。
考虑把每个点拆成
或者你可以设一个状态
后者的复杂度是
算法二
你可以发现每次从点
我们换个角度,考虑有多少次从出生到死亡的过程需要一秒,多少次需要两秒等等。
具体来说,考虑记录
复杂度
算法三
算法3-1
因为所有
算法3-2
或者...让我们回到算法二的第一段。如果你只想到贪心没有想到记录
如果一个点可以被到达(可以安全通过它的父亲了),就扔进来,如果死亡次数大于等于某个点的权值(可以安全通过它自己了),就扔出去。当前死亡次数达到某个点的死亡次数的时候就处理一下询问就好了。复杂度
这两个算法和场上可能出现的各种我可能没想过的算法可以通过子任务
算法四
算法4-1
为了方便叙述,我们把点
然后把所有询问按照左端点从右向左排序,处理
等一下!每次加一个点的时候好像是区间对一个数取max唉,是不是要强上一波segment tree beats(吉司机线段树)啊。如果是场上真的有选手卡在这里的话,我表示非(xiao)常(chu)遗(sheng)憾。回到算法
稍微剧透一下兹磁区间覆盖和区间求和的线段树就可以最终解决问题。复杂度
算法4-2
首先还是从右往左处理所有东西。注意到当处理到点
如果把所有这样的点删掉,我们就得到了一个单调栈!然后每次往左扩展一个点就维护一下,询问直接二分就好。注意当删掉一些点以后相当于边权可能会
这两个算法可以通过子任务
算法五
算法5-1
大致和算法4-1差不多,加上树链剖分和启发式合并的话就能直接做了。代码可能会有一点长。
什么你说不会做?如果能写出4-1的代码,你肯定已经知道了如何往一棵线段树上加一个点更新信息。然后树链剖分以后对于每个点,首先把它的重儿子的线段树拉过来更新一下,然后对于它的每个轻儿子的重链(注意不是轻儿子的子树,否则可能复杂度会多一个log有卡常风险)对应的线段树拉过来更新当前点的线段树就好了。推荐按照树剖的DFS序建一棵线段树,然后上面提到的所有操作都可以在这一棵线段树上做。复杂度
算法5-2
同算法4-2,同样是加上树链剖分和启发式合并搞一搞。复杂度
算法5-?
这题还有很多做法,比如你不喜欢用普通线段树换成动态开点的线段树或者可持久化线段树或者treap什么的也是可以的。当然复杂度和常数就要自己保证了。myy似乎提了一个按权值建LCT的做法:http://matthew99.blog.uoj.ac/blog/2296
数据分块鸡
子任务一
设
时间复杂度:
子任务二
我们可以尝试预处理
设
预处理完之后 DP 的复杂度就变成
子任务四
通过数(da)学(dan)证(cai)明(xiang)我们发现,这个 DP 满足决策单调性。
于是我们可以采用对于满足决策单调性的 DP 的通用做法:在 DP 的同时维护一个单调栈,转移的时候在栈上二分一下得到最优决策点。
计算
时间复杂度:
子任务三
通过更进一步的分析,我们可以证明分界点只有可能是
时间复杂度:
同构判定鸡
from ppfdd,具体想法 from vfleaking,题解也是 vfleaking 写的。
题出得比较仓促,所以测试点只有
YY 一个图同构算法 → 不会卡 → 再 YY 一个图同构算法 → 还是不会 → 要不咸鱼一下爆搜看看效果如何 → 那不就从构造题变成爆搜题了,不清真 → 继续 YY……
由于我太弱了所以测试点也比较弱,大家玩得开心就好。
卡算法一
算法一:仅检查结点数及边数是否一致。
直接扔个点数边数相同的两个不同构的图就行了,可以获得
卡算法二
算法二:首先仅检查结点数及边数,然后结点数很小时使用暴力,否则视为同构。
在卡算法一的基础上造个大一点的图。
卡算法三
算法三:初始每个结点颜色相同,每次对于每个结点结合自身的颜色和周围邻居的颜色编码产生新的颜色,反复迭代直至稳定。将最后每个图所得颜色进行排序,若相同则视为同构。
废话好多!直接扔两个度数相同的图就行了。
卡算法四
算法四:与算法 3 类似,只是用结点间最短距离信息初始化结点颜色。
有两个方法。一个方法是人类智慧构造一下。首先仿照卡算法三的思路,这个图最好是每个结点的距离数组都长得一模一样。那么考虑把大家围成一个圆圈尝试有规律地连边,试了下最后竟然成功了。
A:
B:
这样构造发现恰好是满足的,就可以同时卡掉算法一二三四了。
还有另一个构造,方法是找两个不同构且每个点度数都相同的图,分别新建一个点向所有点连边。这样其实原图中没有边相连的两个点距离就为
另一个方法:大爆搜所有无向图,搜到
卡算法五
算法五:枚举一个图中的一个固定的结点与另一个图中哪个结点对应,将他们分别染成特殊的颜色,其它结点颜色照常初始化,再用算法 3 中的迭代。若存在一种对应使得最后所得颜色相同,则视为同构。
只用在卡算法四的基础上往前面插入一个编号为 1 号点向所有其他点连边就行了,这样给这个点特殊染色不会带来任何信息。
另一个方法:大爆搜所有无向图,搜到
卡算法六
算法六:一种基于邻接矩阵的整数次幂的迹的哈希算法
啊发现哈希好难卡……发现哈希的模数是 int 范围的。考虑用爆搜来构造。
但是要怎么快速生成很多个满足前 5 个算法的图呢?
可以这样想:算法五里引入的这个向所有点连边的点不会带来任何信息,所以多加几个这样的点也肯定满足题目条件。而且进一步考虑在这样的新点之间连边,如果连边方式一致,那么同样也不会给那个
所以我们可以在卡算法四的基础上,给
这个哈希函数实在是算得太慢了,GG 怎么办呢。如果用生日攻击的话,那么模数是
然而我们可以结合卡算法四中的第二个构造。把新点随机成点度数相等的图就好了。由于
当然场上有一位机智 bzoj 给出了一个直接的构造:在这里 太强了……QAQ……
终极武器
好吧虽然不是想鼓励大家这样做,但是可能很有效。上网搜“graph isomorphism counter example”,可以得到一些奥妙重重的卡图同构算法的反例。下载一些下来喂进交互库说不定哪个就成功了。囧rz……以后出题还是要注意注意别出这种能 google 的题。
嗨呀以及感觉这次的题目总体还是偏难,感谢大家参赛啦!