SMOI-R1 赛后若干个月的总结
打得非常好的一场比赛,所以才来写总结。
T1 「SMOI-R1」Queue
打表找规律题,太签到了,不讲。
T2 「SMOI-R1」Company
首先,如果要使得
不难想到一个结论:如果将初始时每一棵树缩成一个节点,那么最优解形成的新的树必然是一条链,且链的两端分别是初始的第
由于初始每棵树都有根,且题中的连边方式是让叶子节点与树根连边,也就是说最终形成的树也一定是一个有根树。我们不妨来探讨一下这个树根:
-
如果树根为
或者 ,这就很显而易见了。假设现在树根为 ,那么就说明树中最深的节点就是 。我们记录一个当前节点下标 ,初始时 ,每次我们找到 所在的树 中距离 最远的一个叶子节点 ,接着让 移动到 处,这个时候我们再考虑跳到另一个树的根上。总的来说,我们到达的树的先后顺序是 ,括号中的可以任意改变顺序。因此,对于所有 的 , 在其中移动的距离一定是树的深度;对于 , 移动的距离是 到某一个叶子节点的最远距离;对于 , 移动的距离则是 的深度。计算此类情况的答案时,只需要计算它们的和就行了。 -
如果树根不是
或者 ,则说明 的移动方向是先往上,后往下。我们考虑枚举这个树根 ( )。由于 在除了 以外的所有树中经过的距离都是其深度,所以这些树的排放并不重要。而对于 , 的其中移动的距离分别是 在树中的深度;对于 ,由于它肯定是选择了两个叶子节点进行连边,所以 在其中移动的最大距离就是最远的两个叶子节点之间的距离。由于枚举的时间复杂度是 ,我们记 表示第 棵树的最大深度,然后计算 ,每次计算除了 之外的树的总代价时,我们只需要用 减去 就行了。
综上,对于
但是要注意,树与树之间的连边也会计入答案。考虑到最终的树的组成形态,我们可以知道一共会添加
T3 「SMOI-R1」Game
首先有一个非常常规的思路:枚举每一个数,求出其作为最大值的区间个数。这道题也是如此。
如果最终的序列
但是需要注意,有的区间是会被算重的,比如
但是出题人非常可爱啊!这个
我们将
先考虑
我们记
每一个子段的顶点值我们就算完了,我们考虑将这种做法拓展到其它数上面。其实我们可以利用图像去思考:
我们知道对于每一个数,要去找前面和后面比自己大的,由于除了顶点以外,每个数的后面都有一个比自己大一的数,所以右侧比较好找。而对于左侧,我们结合上图去思考,不难发现最终形成的
但是对于每个数都用单调栈的话显然会寄。
我们可以找一下规律:
考虑对第
于是我们用单调栈去储存
这样就可以
根据单调栈的性质,可以推断
T4 「SMOI-R1」Apple
听网友说是个 CF 里面经典的 Trick,但是我不知道,不然我应该可以拿
不过不要慌,只要我现在会了就行。
对于这种进制上的子集问题,我们难以使用线段树这一类树形数据结构进行维护,所以我们可以考虑这样一个 Trick:对于一个
由此,我们设
因此总时间复杂度就是
整体来说,感觉和 meet in the middle 的结构是差不多的,都是做到了把时间复杂度上的指数减少一半。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步