4月CF杂题
Codeforces Round 862 (Div. 2)
E. There Should Be a Lot of Maximums
题意:定义一棵点有颜色的树的 \(\text{MAD}\) 为树上编号最大的出现了至少两次的颜色。对于树上每条边,求出断开它后生成的两棵树的 \(\text{MAD}\) 的最大值。\(n\le2\times10^5,a_i\le10^9\)。
先找到整棵树的 \(\text{MAD}\):如果 \(\text{MAD}\) 出现次数 \(>2\),根据抽屉原理,不论怎么分答案都是 \(\text{MAD}\);如果没有 \(\text{MAD}\),答案都是 0;如果 \(\text{MAD}\) 出现次数 \(=2\),发现除了 \(\text{MAD}\) 出现的两个位置路径上的边,其他边答案都是 \(\text{MAD}\),路径上直接暴力遍历时开桶统计答案即可。时间复杂度 \(\text{O}(n\log n)\),其中瓶颈为离散化,解决问题只用 \(\text{O}(n)\)。
F1. Survival of the Weakest (easy version)
题意:定义 \(F(a_1,a_2,\ldots a_n)\) 为在 \(a_1,a_2,\ldots a_n\) 中任选一对 \(i,j(i<j)\) 能得到的所有 \(a_i+a_j\) 的前 n-1 个最小值。求 \(\underbrace{F(F(F\ldots F}_{n-1}(a_1,a_2,\ldots,a_n)\ldots))\)。\(n\le3000,a_i\le10^9\)。答案对 \(\text{998244353}\) 取模。
联想到 146. 序列 的做法,我们就在 \(\text{O}(n^2\log n)\) 的时间内解决了这个问题。那么取模呢?发现 \(\underbrace{F(F(F\ldots F}_{n-1}(a_1,a_2,\ldots,a_n)\ldots))=\underbrace{F(F(F\ldots F}_{n-1}(0,a_2-a_1,\ldots,a_n-a_1)\ldots))+2^{n-1}a_1\)。
F2. Survival of the Weakest (hard version)
题意:同上,但是 \(n\le2\times10^5\)。
刚刚的做法怎么优化?直觉告诉我们一个数组中较大的一些数是没有用的。更具体地说,我们只需要保留数组中前 \(\text{64}\) 个数,这样就是 \(\text{O}(384n)\) 的(\(384=64\times\log64\))。那么为什么呢?
如果 \(0,a_1,\ldots,a_n\) 满足 \(a_1+a_2< 0+a_n\),则 \(a_n\) 可以删除;反之,则 \(F(0,a_1,\ldots a_n)=[0+a_1,0+a_2,\ldots 0+a_n]=[a_1,a_2,\ldots a_n]\) 等价于 \([0,a_2-a_1,\ldots a_n-a_1]\),\(F(0,a_2-a_1,\ldots a_n-a_1)=[a_2-a_1,a_3-a_1,\ldots a_n']\) 等价于 \([0,a_3-a_2,\ldots a_n'']\)。因为 \(a_n''\le a_n-a_2,a_1+a_2\ge 0+a_n\),得到 \(a_n''\le\frac{a_n}{2}\),即两次操作后最后一个数要么消失要么减小至少一半,故只用保留大约 \(2\log{a_n}\approx64\) 个(因为实际操作时我们需要略多保留几个)。
好像可以只保留 \(\text{44}\) 个?没太看懂,把图片放上来吧。
Educational Codeforces Round 146 (Rated for Div. 2)
D. Balancing Weapons
题意:定义一次操作可以把 \(d_i\) 变成任意正整数。求最小操作次数,使得 \(\max\limits_{i=1}^nf_i\times d_i-\min\limits_{i=1}^nf_i\times d_i\le k\)。\(n\le3000,k\le1500,1\le f_i\le2000,1\le d_i\le10^9\)。
首先改 n 次一定可行,只需要判断答案能否小于 n。枚举不变点 \(j\),那么其他点 \(i\) 一定只有三种改法:改在 \(f_j\times d_j\) 附近(上/下取整)或不变。把这些选择排个序,相当于每次选一段位置差不超过 k 的选择,求是否包含了所有点和修改的代价和。双指针维护。时间复杂度 \(\text{O}(n^2\log n)\),瓶颈在排序。
E. Chain Chips
很板吧。
题意:一条链每个点上有一块编号与点相同的芯片,求最小的所有芯片移动距离之和,使得所有芯片与点错拍(每个点上放一个)。支持单点修改边权。\(n\le2\times10^5\)。
发现使一段错拍的代价为 2 倍长度,不妨假设所有边全部会经过,问题转化为选一些不相邻的边,使得权值和最大。\(f_{i,0/1}\) 表示选/不选 \(i\rightarrow i+1\) 这条边。\(f_{i,0}=\max(f_{i-1,0},f_{i-1,1}),f_{i,1}=f_{i-1,0}+2w_i\)。写成矩阵就是 \(\begin{vmatrix}0,0\\2w_i,-\infty\\\end{vmatrix}\times\begin{vmatrix}f_{i-1,0}\\f_{i-1,1}\\\end{vmatrix}=\begin{vmatrix}f_{i,0}\\f_{i,1}\\\end{vmatrix}\)。线段树维护。
Codeforces Round 866 (Div. 2)
D. The Butcher
题意:定义一次操作是将一个矩形分割成两块,其中一块放到一旁,另一块会留在手上成为下一次操作的矩形(不会交换长宽)。现在给出 n-1 次操作后剩下的所有矩形(顺序不定),求原矩阵长宽的方案。\(n\le2\times10^5\)。
显然最大的长/宽一定是原始矩阵的长/宽,所以只有至多两种方案。怎么 check?每次减掉与当前长/宽相同的所有矩阵。
E. The Fox and the Complete Tree Traversal
题意:对一棵树构造一个排列 \(p_{0,1\ldots n-1}\) 满足 \(\text{dist}(p_i,p_{(i+1)\bmod n})\le2\)。\(n\le2\times10^5\)。
手玩发现有解的充要条件是“把叶子删掉后剩下的部分是一条链”。下面证明必要性和充分性。
必要性:假设删去叶子后不是链,则存在一个点度数 \(\ge3\),这个点无论怎么操作都不可能让三个子树内的点形成回路。
充分性:有构造方案。找到树的直径,以端点为起点。先两步地跳,把原树分层,对于一层内的结点先让叶子加入答案,然后递归处理非叶子,在回溯的过程中把两步跳过程中略过的结点加入答案(具体见代码)。不难发现这样可以构造出一组答案。
Codeforces Round 865 (Div. 2)
D. Sum Graph
题意:交互。猜一个隐藏排列 p(知道长度 n),可以猜两次。初始图为空,至多进行 2n 两种操作:1.指定 x,把所有满足 \(u+v=x\) 的 (u,v) 连边;2.查 \(\text{dist}(p_i,p_j)\)。\(n\le1000\)。
因为一边查一边加边比较复杂,容易改变图的形态,考虑先加边再查询。对 \(x=n,x=n+1\) 进行两次连边可以构造出一条链。发现这样得到的图中的直径端点一定是 \(\left\lceil\frac{n}{2}\right\rceil\) 和 \(n\),刚好 2+(n-1)+(n-1)=2n 次询问。
Educational Codeforces Round 147 (Rated for Div. 2)
D. Black Cells
题意:你站在一条全白的数轴上,初始位置为 0。有三种操作:1.向右移动一格;2.打开 shift 开关;3.关上 shift 开关。在 shift 开关打开期间经过的点(包括打开开关的那个点)将会在关上开关后变为黑色。给定 n 个区间,求在这 n 个区间中恰好涂黑 k 个位置的最小操作数(不可以涂黑区间之外的区域)。\(n\le2\times10^5,k\le10^9,l_i\le r_i\le10^9\)。
假设现在把前 m 个区间全部涂黑了。这样可能会多涂黑一些格子,有两种途径减少他们:1.少走几步;2.有些区间经过时不按 shift。发现除了长度为 1 的区间是方法二比较赚,其它区间选择少走一定不劣。