1. [ARC181E] Min and Max at the edge
场上没人过的神题。(大概是搬运的官方题解)
先考虑如何 chk 一个图是否存在好生成树。观察好生成树的限制,发现其对于非树边的限制是在生成树上连接两点的路径有关。而 Kruskal 的证明就是对于每条非树边,其边权大于所有其路径上的树边,两者很像。
但是题目中的限制是点的限制,转到边上的想法是给点赋点权 ,然后 的边权为 。考虑把 设成一个递增的序列,比如 ,这样边权一定互不相同。
对于一棵好的生成树,设 表示 之间的树上路径,则对于点 要求 。而对于边 ,。设其根据上述定义的边权是 ,则 。这就证明了好的生成树一定是新图中的最小生成树。
因为可以构造出边权互不相同的情况,所以这也证明了好的生成树也是唯一的。跑出来这个图的最小生成树之后,检查每条非树边,如果都满足限制则该图是好的。
但是题目有多次询问,而且这个最小生成树也不是那么好求。不难发现其实图中定义的边权只需要满足 并且 ,即满足区间包含单调性即可。
所以可以把边 赋为 ,这样得到的生成树一定满足对于任意非树边 ,其路径上的最大值就是 。原因是非树边 路径上的边权应当都小于 ,所以如果存在大于 的点则一定不合法。而且因为是 ,所以合并两个连通块的时候,一边选择的较小的点会尽可能的大,这也满足路径上的最小值尽量是 。
但是这样还是需要 chk 路径上点的最小值是否满足条件。可以再反着做一遍,,同理得这样求出来的东西的最小值一定合法,最大值尽量合法。因为已经证明了好的生成树唯一,所以判一下两棵树是否相同即可。
这样就将问题转化成了比较好的形式:删边求最小生成树,可以看成是找一条非树边 满足 最小。转成 dfn 序之后可以看成是两个 3-side 矩形查最小值,可以扫描线线段树维护,复杂度是 。
2. [ARC181F] Colorful Reversi
首先观察一下,对于 这种情况来说,两个 之间永远不可能发生操作。而 这种情况,两个 之间是有关联的。有一个很天才的想法是建树,一开始只有一个节点表示 ,维护一个指针 表示当前在树上的哪个节点,接下来依次加入每个点 :
- 若 所在点的颜色和 相同,则 不动。
- 否则若 所在点有邻点的颜色是 ,则 走向该邻点。
- 否则新建一个节点,颜色为 , 走向该节点。
这样就得到了一棵操作树,它有一些很好的性质:
- 假设生成时在上面走过的路径是 ,则操作 等价于把 变成 。
- 对于原序列,如果能够操作 则 一定属于同一个点,否则 属于不同的点。
- 对于路径 ,通过操作将其变成 的最小代价是 ,其中 表示两点树上的距离。
接下来,对于 的起始节点 和终止节点 ,最终序列的形态是若干个颜色段,而颜色恰好就是从 走到 所经过的简单路径上的颜色。证明很简单,显然路径上两个不同的颜色段永远无法合并,而如果存在其他的颜色则其两边的颜色一定是相同的,能再操作一次。
所以拉出树上 之间的路径,对于此路径外的部分一定会合并到路径上,可以先 dfs 一遍算出贡献,这样可以得到从 得到一个新的序列 。接下来要解决问题的就是:现在有一个序列 ,满足 。现在要生成一个新的序列 ,满足:
- 。
- 。
- 。
在此基础上满足 最小。设 表示考虑了 的 , 时代价的最小值, 表示 上一次出现的位置。转移比较简单:
因为 是上一次出现的位置,所以对于所有的 要么 全部大于 ,要么全部小于 ,可以前缀和处理一下 转移。这样 加上之前把树缩成一条链的代价就是答案,复杂度是 或 。
3. CF1988F Heartbeat
最大值把序列分成两部分,前一部分对前缀最大值个数有贡献,后一部分对后缀最大值个数有贡献,可以分开算。
设 表示 的排列,有 个前缀最大值, 个上升的位置的方案数。不断向右边加数不好做,不断加入 也不好做,因为可能前缀最大值个数会变少。所以考虑不断的加入新的 ,把原来的值域整体平移。转移比较平凡:
- 放在最前面:。
- 放在最后面:。
- 放在上升的位置中间:。
- 放在下降的位置中间:。
预处理这部分的复杂度是 的。然后把两个拼起来的时候,前后缀最大值个数的贡献可以提前算,上升位置个数的贡献最后算。然后发现转移是二维卷积,可以拉插。
4. P10008 [集训队互测 2022] Range Minimum Element
难点在于双射构造。
首先考虑给定了 如何进行判定。从小到大填数 ,每次把能填的地方( 的区间之外)全部填上 ,这样填一定是最优的。合法当且仅当这样生成的序列 对应的 就是 本身。
发现通过这样的生成方式,合法的 和 是一一对应的,所以对 计数可以转为对能被这样生成的 计数。
如果给定了 ,如何判 是否合法?找到第一个最小值的位置 ,把 变成 和 。因为 中并没有被填上最小值,所以被 包含的区间一定选择的都是大于最小值的数,并且他们的的并集一定是 。然后递归判断 和 是否合法。
上述过程是值域从小到大,分裂序列。计数就考虑值域从大到小,合并序列。 表示区间 填入了 中的数的方案数。转移就是枚举最小值的位置 :
第一种转移表示区间内没有 的数。预处理合法区间,暴力做复杂度是 。套路性的,不难归纳证明 是一个关于 的 次多项式,可以拉插。
5. [ARC179E] Rectangle Concatenation
并不困难。只是唐完了。
稍微观察一下发现矩形只有两种形态。考虑暴力:从每个 开始向后扫,设 表示能否拼在左右, 表示能否拼在上下。设 表示 内矩形的面积和,没想到用面积判就败了:
考虑优化:把 从左向右扫,维护合法的 。设 表示 合法的 集合, 同理。发现 的时候,观察式子左半部分, 可能会做一个清空操作。
咋回事啊,感觉用面积判定大概是想到了的。一直在瞎想维护两个矩形如何在最左边加。哎。
右半部分看成面积前缀和相减,合法的 是唯一的。是一个单点加入,容易维护。还需要拿一个桶维护 。时间复杂度 或者 。
6. [ARC182F] Graph of Mod of Linear
首先判掉 的情况。把问题分为 是否互质。
1.
首先定义 表示从 开始走 步会走到哪。显然:
然后是一步神奇的转化。我们希望能只保留在环上的点,而 一定在环上,并且对于 , 一定涵盖了所有在环上的点(所有在环上的点的 已经涵盖了)。所以环上的点可以表示为:
对于 向后走一步:
取 :
所以问题可以从 变为 ,转成了互质的情况。
2.
设 表示第 个点所在的环长,则 就是答案。
从 开始走 次走回自己,要求的就是:
把模数再变形一下。设 ,令 ,,则:
此时 已经互质,所以 的贡献只有 中的因子。设 ,则:
令 ,则如果 ,则每个 都一定恰好被覆盖了 次。所以现在要求的就是:
其中 是满足 的最小整数。
首先有性质:
- 若 ,则 。
- 的解都是 的因数并且 一定能被表示成 ,其中 表示最小解。
若 ,则:
所以 一定是 的倍数。所以可以用记忆化搜索的方式求解所有的 :考虑把 质因数分解, 初始化为 ,然后不断尝试除 的因子,继续用快速幂判是否合法。
这样求出 的答案,然后将 乘一个 的质因数,令 初始化为 ,再进行不断尝试除质因子的过程。复杂度一个很松的上界是 , 表示质因子个数, 表示因数个数。但是完全跑不满,所以还是能过的。
7. [ARC178E] Serval Survival
非常生气,点开一道看起来很正常的计数,推着推着就发现需要多项式/fn。
首先对于“撞上了之后调头”这种东西有经典的思想:可以看成是互相穿过并没有调头。但是因为要求第 只猫走过的路,所以可以看成是和撞上的猫互换身份。
手玩一下可以发现,如果第 只猫向左走,它会和 左边的第一只向右的猫互换身份,然后和 右边的第一只向左的猫互换身份,然后和 左边的第二只猫向右的猫互换身份,位置指的都是初始位置。
第 只猫走的路程就等于最后一只和他交换身份的猫直走能走的路程(向右为 ,向左为 )。据此,我们可以找出第 只猫的策略。
设 左边向右走的猫的集合为 , 右边向左走的猫的集合为 ,分类讨论:
1.
如果他向左走,最后和他交换身份的猫是 中从右向左第 只猫。如果他向右走则是 中从右向左第 只猫。因为是向右走,显然靠左边的猫一定走的更远,所以此时他一定会向左走。
2.
和上文同理,一定会选择向右走。
3.
此时他有两种策略:选择 中最靠左的 和 中最靠右的 ,这是唯一有决策的点,需要选较大值。
考虑暴力 DP:设 表示第 只猫的答案。
第一种情况 :
上面使用了范德蒙德卷积化简。发现组合数可以拆成 相关的式子,可以 FFT。
对于 的情况同理,可以把整个序列倒过来做一遍。
第二种情况 ,假设最大值在右侧取到:
表示最小的 满足 。还是范德蒙德卷积,但是这个式子并不好用 FFT 处理。考虑写成生成函数形式,令 表示 ,则:
是为了构造组合数系数, 是因为 对 贡献, 的下指标是 ,需要做一个整体平移。
因为 是单减的, 是单增的,可以分治解决:设 表示 , 表示 , 表示 区间对答案的贡献。合并:
合并的时候暴力 FFT 即可。这样最终答案就是 , 表示最小的 满足 。因为 的值域都是 的,一个点最多被 次 FFT 包含,可以分析出复杂度是 。
8. *P10896 移言丁真:Unavoided linyue
首先考虑确定了所有串怎么求最小值。首先每个串肯定是内部尽量匹配,然后左边剩了若干个右括号,右边剩了若干个左括号。设 表示左边右括号的数量, 表示右边左括号的数量。
手玩一下,观察任意一个拼接方式,尽量匹配之后,一定是有一个串作为中点,他左边最终只剩下了右括号,右边只剩下了左括号。所以考虑钦定一个串作为中点。剩下的串若 则拼接在右边,否则拼接在左边。
显然钦定作为中点的串的 应当尽量的大,所以答案即为 。
先统计 。看成网格图,左括号是 ,右括号是 ,则要求从 出发,中途纵坐标的最小值为 ,最后的纵坐标大于等于 。荣斥一下变成最小值 减去最小值 ,旋转 之后做一个反射荣斥即可。答案是:
对于最小值再右边的情况要求左边最后大于起点,只有上取整变成 之后除二上取整。这个式子可以暴力算。
对于 ,可以枚举 ,计算 的情况数,即存在一个 。可以用 减去全都 的。所以答案就是:
可以暴力计算。最后还有内部匹配的贡献,看成 ,和计算 一样的方式计算即可。
9. [ARC083F] Collecting Balls
建图,连边 ,这样会形成一个基环树森林。对于基环树的每条边,需要把他归到他连接的两个点中任意一个,并且每个点只能拥有一条边。
对于每个基环树分别计算,树边归属的点一定是它两端深度较大的那个,环边归属点整体只有两种方式:顺时针和逆时针。确定了边挂在那个环上时候,操作顺序的限制就是,如果边 归到了点 ,则要求所有 的边需要在它之前操作。
把边看成点,再建一个图,不难证明这是一个森林:对于树边之间显然只有从下到上的边,环边上的边形成了若干条链,还有一些环边指向树边的边,所以一定是外向树森林。拓扑序计数对于一棵树就是 , 表示子树大小。
10. [ARC177F] Two Airlines
有点魔怔的题。
一个基本的观察是如果当前某个人 拿着盒子走到了位置 ,那位置小于 的人一定永远没用了。如果之后要用到前面的人 ,就应当让 拿着盒子走到 而不是让 ,这样 待在原来的位置,代价一定不会更劣。
再手玩一下,可以发现每次的过程都是:某个人 拿起盒子,走到某个地方。然后后面来了一个和 颜色不一样的人(或者是本身就在这个地方的人),走到了 现在的位置,然后带着箱子走了,此时 也已经没有用了。
进一步的,“后面来人”的这个过程,对于每种颜色内部,一定是先用坐标尽量小的人来。这个结论不难用调整法证明。
而最优解一定能用上述过程刻画出来。所以可以设 表示当前盒子在 ,被 颜色的人拿着, 后面的 个颜色为 的人已经用过了(此时在 的位置), 个颜色为 的人已经用过了。转移 ,状态数和复杂度都是 的。
接下来的一个想法观察性质,能不能简化一维状态什么的,但是好像不太好做。除此之外比较自然地,可以感受到 都不会太大,设成 左右,交上去就直接过了。下面证明 都只需要取到 。
直观感受一下,“后面来人”的原因一定是, 后面有一段比较长的和当前拿着箱子的颜色不同的路。
红色和蓝色的块分别表示序列上红色和蓝色的连续位置。红色段里面不一定全部都是红色,蓝色段里也不一定全是蓝色。红色和蓝色的线条表示人走过的路程。 表示这个蓝色段里面有多少个蓝色格子。
称除去搬运盒子过程中造成的代价为“额外代价”。因为第二条红色线条走到他的目标位置(第二个红块)额外花费了 的代价,所以 ,否则可以让第一个人直接走到第二个红色段:
这样一定不劣。后面的同理,,所以最多 轮之后 就要超出值域了。所以 的维度都只需要开到 。预处理一下还是能做到 转移。总复杂度 。
11. [ARC176D] Swap Permutation
对每个位置分别算贡献。一个很重要的观察是其他所有数都是等价的(非常神奇)。设 表示原来 位置上的数, 表示原来 位置上的数, 表示其他的数,设 表示经过 次操作之后 的概率。每个位置 的 都是相同的。转移系数应该比较容易手搓出来,预处理 可以暴力 DP,也可以矩阵快速幂(所以其实可以做 的)。然后对于每个位置分类算贡献即可。总复杂度 ,其中 。
12. [ARC183D] Keep Perfectly Matched
这场不打感觉亏麻了,怎么大家都不会 D。首先匹配路径长度之和最大,很典的想到取重心,猜测答案上界 可以取到。
取完重心之后,希望不断把两个不同的子树里的点进行匹配,直到删空。因为原树本身存在完美匹配,所以找一对不同子树里的点删去后,根节点的匹配一定变了。
所以选的点一定有一个在根节点当前的匹配点的子树里,否则根节点没有理由更改匹配点。设这个点为 ,则 一定满足:其到根的路径上,边的种类是“匹配边,非匹配边,匹配边...”,即:
图中标 的边是匹配边,可以发现删六号点是合法的,而删 号点的过程中会因为连续出现了两条非匹配边而寄掉。
这样确定了一个子树中的点,另一个点是可以任意选的。因为要尽量匹配对,所以另一个点应该选在除此之外的 最大的子树里面。接下来根的匹配就是选的第二个子树中的根节点。继续做上述过程即可。
这样做为何能取到最优值:设 是根的初始匹配节点,首先第一次删点的两棵子树一定分别是 ,然后第二次因为此时根和 匹配,所以要删 ,以此类推,可以发现除了开始的 删了一个点,剩下的操作都是,选一个子树删两个点,然后跳到另一棵子树。
除了 子树大小是奇数,剩下的子树大小都是偶数,一开始 删了 就全部变成了偶数。所以不会有奇偶性不对的情况。如果跳到另一棵子树选择当前 最大的,那就一定能够删空。因为此时根是树的重心,每个子树内需要的操作次数大小都不会超过 ,其中 是总操作次数,所以这样做一定不会爆掉。
现在的问题就是如何高效的找出当前能删掉的合法点。策略也很简单:对于点 来说,如果初始他的匹配是他的父亲,则他儿子可以按任意顺序一个一个删光。
如果初始他的匹配是他的某个儿子,则先把这个儿子全部删空时最优的。然后他的匹配就变成了他的父亲,他剩下的儿子可以任意排列。
可以 求出每个子树的后序遍历,如果有某个儿子和他匹配就优先向这个儿子走,这样可以求出每个点的合法操作序列。然后套用上述过程,总复杂度 或者 。
13. 炫酷原神
题如其名。每种颜色分别算贡献,子区间个数看成所有连续区间选 个可重位置。
设 表示,当前在位置 , 表示剪贴板是对的并且当前区间没选数的概率, 表示剪贴板是对的并且当前区间选了一个数, 表示答案, 表示剪贴板是错的并且当前区间没有选数, 表示剪贴板是错的并且当前区间在剪贴板是对的的时候选了一个数。每种颜色都这么做一遍,对的颜色的 Ctrl C
的系数矩阵(行向量在左,矩阵在右)是:
然后是 Ctrl V
:
遇到错的颜色的 Ctrl C
:
线段树维护区间矩阵乘积。虽然有 棵线段树但是每次实际只会改两棵。,需要一定常数优化:可以把矩阵展开,发现比如 对 和 永远没有贡献, 和 对 也永远没有贡献,去掉一些冗余的乘法,实际上 远远跑不满。
14. *王者题目
没听题解,自己糊的,不知道对不对。
首先经过一些简单的观察,有大于四度的点答案一定为 ,并且四度点最多只有一个。有四度点的话,确定了四度点填啥别的都基本确定了,比较平凡。
然后考虑树, 如果填在二度点或者三度点上比较平凡,只考虑 在叶子上。首先暴力是枚举每个叶子作为根填 , 表示如果 填 ,其子树内填成一个连续的值域前缀的方案数。
第一种转移:
即在一条链上向下走三步,容易发现 之后的是一个子问题。
第二种转移:
即填数到第一个分叉路口的时候,前面的值域都填满了。设三度点填的是 ,则后面只能填 和 ,然后只能填 ,直到一条链似掉,此时 之后递归进子问题。
第三种转移:
此时 都没有填, 旁边的两个点可以填 和 。分类讨论:
填 和
这种情况比较简单,画一下发现填 的那端必定是一条长度为 的链, 那端直接递归进了子问题。
填 和
补完了 之后旁边如果还有空的点,只能填 ,是类似第二种转移的两条链,直到一条链似掉之后进入子问题。
而如果 旁边没有空的点,此时递归到了一个“子树根填 ”的子问题,可以设 表示 填了 然后子树内填成一个满的值域前缀方案数,转移和 一样,唯一的一种额外方式是,如果 旁边有连着一度点的三度点,则可以三度点填 ,然后一度点填 ,然后三度点连着的另一个点的 都可以贡献过来。
填 和
一定要补全 ,然后如果 旁边还有空点,一定填 ,然后进入两条链的情况。如果 旁边没有空点则 直接递归进子问题。
第四种转移
此时 旁边的点一定填了一个 并只有一条链,另一个可以填 也可以填 ,可以从 和 转移过来。
第五种转移(结尾)
两种都比较平凡。总复杂度 ,不知道能不能换根做 。不想写。
15. [ARC183E] Ascendant Descendant
一个直接的想法是求出 表示极大的区间 满足 。由于树的性质, 之间要么相离,要么包含。
但是 并不是 能真正到达的点。因为 只能一个一个交换过去,中途可能会有一些点阻碍着 的交换。具体的,把 构成的树形结构建出来,会阻碍交换的点就是满足 的整棵子树。必要性和充分性都比较显然。(但是想不到啊)
求 是平凡的,一个 LCA 和线段树或者 ST 表就能在 的时间里求出来。后半部分实现的时候可以按照区间长度排序,拿一个 BIT 维护区间和,每次是区间内任选一个点单点加一即可。再用一个 'set' 维护删掉的点。总复杂度 。
16. [ARC180E] LIS and Inversion
首先考虑要求代价为 的一个暴力 DP: 表示填了前 个数,此时相对值域末尾为 的数结尾的 LIS 的最大值。填第 个数的时候,把它插在某两个数之间,所以转移是:
经过观察,可以发现取前缀最大值的操作是不必要的,第二种情况可以直接令 。
证明:假设存在 ,应当用 贡献到 。但是因为 ,所以 ,所以此时 。在 相同的情况下,显然是下标越小的越有前途,所以 不劣于 , 是没有用的。
这样 的转移就变成了:先平移一位,在最前面加入 ,然后做一个 的前缀 的操作。然后可以进一步发现,如果允许代价为 ,则可以看成把 个位置的 变成 ,即前缀加变成了全局加。
所以考虑统计每个位置被多少次前缀加覆盖,这可以用差分简单实现,这样就求出来了 。在最后位置 的答案上界是 ,所以可以花费 的代价()来获得一个 的答案。
17. [ARC175E] Three View Drawing
哎,构造。
首先考虑 怎么做:显然是最上面一层填满第一条主对角线,第二层填满第二条主对角线...(主对角线指可以循环的对角线)。
把 变成满足 的最小的 。然后考虑删去 个。可以发现(谁能发现啊啊啊)在矩形的右下角删掉一个 L
型即可。如果 是偶数则右下角的 保留即可。
设 表示 的边长 (图中为 )。上图是正方体的俯视图,把正方体从上到下分成 层,某个位置填了 代表这个的格子存在于第 层。
首先对于暖色调的填法,可以发现这样对于前 层,从正面和侧面看都是填满的,和俯视图是相同的。
对于紫色,这个位置填的是 ,正好对应了在第 层只有最左边三个有值,符合俯视图。
对于冷色调的其他颜色,都在一个 的正方形里面填的,所以对于第 层,每层从正面和右面看都是恰好 个格子,也符合俯视图。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现