写在前面

这里是出题人 & 组卷人

首先是关于题目难度方面,这一场强度是非常逆天的,整题难度非常高,并且没有太多水题。个人区域赛说是。

最开始的题有一大堆数论/数据结构/结论,非常恐怖。CN刻板印象这一块,另外不要真的变成 THUPC 了啊喂!

后来用很多其他部分知识点的题替换掉之后,知识均衡度才能算是合格,也算是稍微减轻了一点点难度(微乎其微),但强度依旧逆天。

🥺🥺大家骂轻点🥺🥺

:来自 大人的评价:

alt

然后数据部分: 相邻消除这道题,由于出题人忘了放极限数据,导致一开始放过了一车 的做法,好在才开赛没多久,大约在开赛半小时时修复了数据。

🥺请大家狠狠拷打 喵🥺

另外一个 :由于开线下赛的时候漏了一个题,导致此题变成同步赛专享防 了。

alt

唉唉,不过好在比赛还是顺利办完了。

预测难度

按照同步赛题目编号:

实际难度

按照同步赛题目编号:

solution

A 相邻消除

我们定义 表示数组 经过彻底化简后的结果。

根据拼接逻辑,显然有:

其中 表示字符串拼接化简的操作。

对于 操作,一个字符串的逆元等于它的反转,并且“消除相邻相同字符”的操作具有结合律。

故有:

因此我们所求的 ,等于

我们用一颗 树来表示数组的前缀状态。

维护一个栈来模拟消除的过程:

  • 当元素入栈时,在树上向子节点走一步。
  • 当元素出栈时,在树上向父节点回退一步。

这样每一个前缀 可以表示成树上的一个节点,即从根节点走到对应节点 的过程,并且 等于其深度。

表示逆过程,即从 走回根节点的过程。

对于每一个子区间 操作后的长度就等于 对应的节点走到 对应节点的简单路径长度。

使用启发式合并查询简单路径长度为 的点对即可。

注意字母表的大小是 ,需要动态开点。


B 费米子通讯网络

合法方案等价于选择了一种排列,由 连向

表示 连向 的有向边条数。

则有:

其中 表示选择的排列形成了 个环,代价为

定义交换操作:选了 ,其中 ,交换

相当于对于一个排列交换两个元素。

我们可以交换 次,使得排列变成 个环,即每次交换多出一个环,代价乘一个

此时 ,排列是偶排列,且代价为

我们知道:一次交换操作会让排列的奇偶性改变。

这样排列的奇偶性和代价之间形成了双射。

是偶排列时,代价等于 ,是奇排列时,代价等于

恰好满足行列式的定义:

其中 表示排列 的符号, 为偶排列时,符号为 ,为奇排列时,符号为

因此答案为:


C 挑积木

方案数共有 种,接下来考虑计算高度贡献和

将贡献和拆成每一位对答案的贡献,分别求和。

其中 表示第 位的值为 对答案有贡献的方案数。

表示在 中高度小于等于 的积木个数。

表示在 中高度大于 的积木个数。

表示在 中高度大于 的积木个数。

位有贡献当且仅当

由于有 ,则条件等价于 ,即数组中大于 的积木个数大于等于

则有:

最后除以方案数即可:


D 铁银银铜金铜银银铁

由于每个子串都是回文串,所以对于每个长度为 的子串也是回文串,故题目要求等价于字符串每个字符均相同。

因此有:

其中 表示字符 在字符串中出现的次数。


E 树树菌的星形共振

若最终的树有 个节点,它们能形成一个类五芒星图案,当且仅当

只能是奇数。

设这 个节点权值为 ,则有 ,其中 表示异或操作。

题目中的合并操作并不会改变被合并部分的异或和。

等于

考虑贪心。

对于一个以 为根的子树,如果它的异或和等于 ,直接切开 父亲之间的连边即可。

但这样切最终可能会出现偶数个节点。

这种情况出现当且仅当整棵树的异或和是

也就是切出来偶数个权值为 的节点,只需要多合并掉一个即可。


F yourdestroy

这种问题直接求解一般都是很困难的数学问题,所以考虑二分然后判定(显然半径越大越好)

对于一个半径 ,先求出对于一对相邻的车来说,哪些时间段是合法的,由于不同的车发车间隔时间一样,所以只需要考虑前 个车。

当两个车都在线段上沿直线运动时(没拐弯),用相对运动来看这个问题,把一个车视为不动,那么另外一个车的运动就是两个向量相加,也是一个直线运动。所以对于不动的车来说,另外一个车的运动轨迹就是一个线段,想求出二者距离小于等于 的时刻,可以视为一个圆和线段相交的问题。

类似于双指针的思路,同时移动前 个车,当其中一辆车走到站点时就说明要换方向了,这个时候分一次段。总共只有 个点,所以时间段也是 个,对每个时间段分别求出距离小于等于 的时间段。

此时我们得到了对于一对车来说若干个合法的时间段,要判断原问题是否合法。注意到对于 来说,他们的合法片段实际就是把 的往后平移(可以视为在时间轴上循环平移),比如说发车间隔是 的合法时间是 ,那么 的合法时间就是

做一个变换,把时间轴切割成 段然后堆到一起,只要有一个点被覆盖了 次原问题就合法,并且被覆盖了 次的点都是合法的时间点。

具体的做法就是按 处理一下区间,注意大区间可能会进行切割,然后对端点排序后,维护一个计数器 ,遇到左端点 ,遇到右端点 ,只要最大值出现过 就合法。


G A problem of tree

拆位,只考虑第 位的贡献。

我们做树形 ,设 表示以 为根节点的虚树个数, 表示以 为根节点的所有虚树中的所有节点 节点的 的值为 的节点个数, 表示以 为根节点的全部虚树的权值之和。

用类似树上背包的逻辑,设 节点正在考虑儿子 的贡献,记 表示 路径上边权和, 为异或运算,方程易得

现在的问题是我们需要快速计算

考虑用 表示 的距离,这样 ,考虑线段树合并,把 全都插入到线段树上 的位置,这样在查询时,可以根据 的值在线段树上查找 的第 位为 的全部 了 。

总复杂度


H 不协和音程

对于音高 ,存在合法路径当且仅当任意一对音高为 的坐标 ,其中 ,都有

因此按 排序后,只需要判定每一对相邻坐标是否满足 即可。

一种可能的实现是:对每个音高 存一个 ,动态维护每次插入和删除时相邻坐标 的逆序个数即可。


I 唉,搞钱

当我们选了一个字符串后,其所有子串的代价都必须选。

符合最大权值闭合子图模型。

接下来考虑如何建模负权部分的图。

可以用 维护本质不同的子串数量, 树具有非常好的图性质。

再将字符串节点向对应的每个前缀节点连一条 的边即可。

注意不要将 边也连进去,这样可能会导致图变得非常复杂,导致网络流的增广论数爆增从而


J Yet Another Patchouli's Magical Problem

不妨设 ,此时

一种合法的方法是逐行依次放置。

(1, 1), (1, 2) ... (1, m), (2, 1), (2, 2) ... (n, m)

对于任意 之间的负载:

  • 之间存在一条边,对间隔的负载是
  • 对于 ,每个点与 相连,对间隔的负载为
  • 对于 ,每个点与 相连,对间隔的负载为

因此一个负载间隔最大为


K The Eschatology of 0 and 1

对于每一个位置 ,多次进行同一种操作是无效的,故每种操作最多对 进行一次。

表示前 个位置不进行操作/只进行第一种操作/只进行第二种操作/进行两种操作的最小花费。

则有转移方程:

时:

时:

取最小值即可。


L 结束乐队 × 无刺有刺 · 联合 Live 前的交流会

在无向图中,

考虑枚举中间点 ,令 为其邻居集合。对任意

  • ,则 ,不应在 中连边;
  • ,则 给出长度为 的路且不为 ,因此 ,应在 中连边。

可知,点集 中诱导出的边恰好是导出子图 的补图 的边。我们只需对每个 求出 的连通块,并将同一连通块内的点在全局并查集内合并;处理完所有 后,并查集的连通块即为 的连通块。

流程大致如下:

  1. 枚举中间点 ,令 ,即 的邻居集合。

  2. 构造导出子图 的边。 暴力枚举 内点对则为 ,最坏可达 。 考虑采用度数定向,将每条无向边 定向为度数小的一端指向度数大的一端。设定向后出度为 。 由以下引理可得

    ,则 至少有 个邻居度数 ,从而总度数 ,故

    因此对固定 ,对每个 只需遍历 的出边 ,若 则得到一条 内部边。

  3. 求补图 的连通块。

    维护仅包含 内未访问点的双向链表 unvis。每次弹出点 时,先标记其在 中的邻居集合(这些点在补图中与 无边),然后遍历链表,将未被标记的点移出链表并加入 队列,同时在并查集中合并。

  4. 全局维护并查集,累积合并所有 的局部补图连通性,最终统计连通块大小。

复杂度方面:

  • 构造所有 的内部边: 总枚举量为

  • 补图 BFS: 固定 ,设 。补图 BFS 维护 unvis 链表,仅包含尚未访问的点。每次队首为 时,扫描 unvis:若某点 未被标记为邻居,则将其从链表删除并入队;否则跳过。

    删除操作每个点最多进行一次,贡献 ;而对固定 ,被跳过的点必为 中的邻居,跳过次数为 。因此所有跳过次数至多为

    对所有 求和,,且 等价于三角形数的常数倍,最坏为 ,因此总复杂度仍为

  • 并查集操作总次数与上述取点/合并同阶,均摊为 ,不构成瓶颈。

综上,总时间复杂度 ,空间复杂度


M 大王叫我来巡山

对于题目要求:从 点出发,必须经过每一个魔法传送门一次,且最后回到节点

即整张图符合欧拉回路的要求。

回忆有向图中欧拉回路的充要条件:每个节点出度等于入度。

记录每一个节点 关于传送门单向边的出度 入度,记为

对于一条树边,它被经过的次数等于它两侧节点 之和的差值。

由于存在一些树边被经过 次,整张图可以被分成若干个存在欧拉回路的连通块。

但我们只能从 节点出发,所以必须将这些联通块合并成同一个。

对这些连通块跑最小生成树即可,每次连接的树边依然需要满足欧拉回路的条件,因此必须经过 次,代价为