ARC 做题记录
Preface
ARC C~F 选择性做题记录,难度大概在 \(*2400\sim *3000\) 左右 (蓝至紫)
无特殊说明每个题的时空限制都是 \(\text{2sec, 1GB}\)。
难度记录方法: \(x/_y\),其中 \(x\) 为 kenkoooo 所述难度,\(y\) 为个人认为的洛谷难度(标的偏低)。
题号后有 * 表示尚未完全理解。题意使用引用格式写在题解最前。
进度:https://docs.qq.com/sheet/DU09LZXhRcVZEdnpt?tab=BB08J2
ARC120E 1D Party \(*2653/_{6.3}\)
给定一个长度为 \(n\) 的数组 \(a\) 满足单调递增且每一项都为偶数。每一时刻玩家可以将每一个 \(a_i\) 都增减 \(1\) 或不变。
求最小的时间长度 \(k\) 使得对于所有的 \(1\le i\le n-1\) 都有一个满足 \(1\sim k\) 的时刻使得 \(a_i=a_{i+1}\)。
\(1\le n\le 10^6\)。
将 \(a_i\) 看作数轴上的点。操作即为给每个点 \(-\text{1/0/+1}\),\(a_i=a_{i+1}\) 即为两点碰撞。
有显然的性质:每个点的轨迹一定最多有 \(1\) 个拐点。
观察到在第一次碰撞之前一定有两个相邻的点是在向中心走的,且碰撞完后会以中心为拐点反向前进,假设这两个点是 \(c,c+1\)。考察这个过程,发现由于所有点是本质相同的,这个操作可以看作在时刻 \(0\) 时将 \(a_c,a_{c+1}\) 交换,二者在经过拐点之后不改变方向继续行进,整个数组被划分为 \([1,c)\) 和 \((c+1,n]\) 两个互不干涉的子问题。
对于一个长度为 \(2/3\) 的子问题其答案即为 \(\frac{a_{r+1}-a_{l-1}}2\)。由于经典套路,长度 \(\ge 4\) 的区间将其拆分一定更优。于是,考虑对于其进行线性 DP 枚举区间长度是 \(2\) 或 \(3\) 即可。
复杂度 \(\mathcal{O}(n)\)。
ARC121D 1 or 2 \(*2784/_{6.0}\)
给定 \(n\) 个数,每次可以选一个或两个数,将它们删除并把他们的和记录下来。
你需要最小化一个取数方案使得最终所有数都被删除,且记录下来的数中 \(\max-\min\) 最小。输出这个最小值。
\(1\le n\le 5\times 10^3,-10^9\le a_i\le 10^9\)。
考虑如果已经确定了要成对删去的集合,那么一定是第 \(x\) 大和第 \(x\) 小配对,调整法容易证明。
把删一个数的操作都看成补一个 \(0\) 后的成对删除,那么枚举补了多少 \(0\) 后使用以上方法暴力做就完了。 \(O(n^2)\)。
ARC121E Directed Tree \(*2645/_{6.3}\)
给定一个 \(n\) 个点的有向树,父亲向儿子连边。
求满足以下条件的排列 \(p\) 的个数: 对于任意的 \(p_i\),无法从 \(p_i\) 沿至少一条边走到 \(i\)。
\(1\le n\le 10^3\)。
限制即为,\(a_i\) 不能在 \(i\) 的祖先链上。由于一个排列有且仅有一个逆,我们转而求逆的个数,此时限制即为 \(a_i'\) 不能在 \(i\) 的子树中。
考虑容斥。设 \(g_i\) 为至少有 \(i\) 个位置 \(x\) 满足 \(a_x\) 在 \(x\) 的子树中,答案即为 \(\sum\limits_{i=0}^n (-1)^ig_i\)。
观察到 \(g_i\) 可以使用树上背包的形式处理,设 \(f_{x,j}\) 为 \(x\) 的子树内有至少 \(j\) 个点满足 \(a_y'\) 在 \(y\) 的子树中。转移是简单的。
复杂度 \(\mathcal{O}(n^2)\)。
ARC122E Increasing LCMs \(*2535/_{6.0}\)
问号
给定长度为 \(n\) 的数组 \(a\)。求 \(a\) 的任意一个重排 \(b\) 使得前缀 \(\text{lcm}\) 严格单调递增 或报告无解。
\(1\le n\le 100,1\le a_i\le 10^{18}\)。
发现从前往后确定是比较困难的,考虑反着来。
容易发现一个数放在位置 \(x\) 合法的条件是 \(\gcd(\text{lcm} _{i=1}^{x-1}\) \(a_i,a_x)<a_x\)。
可以转化为 \(\operatorname{lcm} _{i=1}^{x-1}(\gcd(a _{x-1},a_x))<a_x\),这样不等式左侧就能够存储了。
那么,现在我们能快速在确定了当前位置前面的数的情况下确定当前位置。那么,容易找出所有能放在 \(b_n\) 的数。
现在考虑有多个数可选的时候选哪个。可以较为简单的证明,这种情况下,选哪个数都不会影响最后是否有解。
又发现可选集合大小是不减的,故维护可选集合并随意向后填数,若不合法则报告无解即可。
复杂度 \(O(n^3\log A)\)。
ARC123E Training \(*2828/_{6.0}\)
有两个变量 \(x,y\),初始时 \(x=a_x,y=a_y\)。在接下来的时刻中,若时刻数是 \(b_x\) 的倍数那么 \(x\leftarrow x+1\),若时刻数是 \(b_y\) 的倍数那么 \(y\leftarrow y+1\)。
求在时刻 \(1\sim n\) 里面有多少时刻使得 \(x=y\)。
\(T\) 组多测,\(a_x\ a_y\ b_x\ b_y\) 会被修改。\(1\le T\le 2\times 10^5,1\le n\le 10^9,1\le a_x,a_y,b_x,b_y\le 10^6\)。
考虑写出形式化式子,\(x=y\) 的条件即为 \(\lfloor\frac{n}{b_x}\rfloor-\lfloor\frac{n}{b_y}\rfloor=a_y-a_x\)。现在假设 \(b_x<b_y\)
把等式左侧看作 \(+1/\)\(-1\) 标记,观察到左侧的值不会偏离 \(\frac{n}{b_x}-\frac{n}{b_y}\) 很远(保持在 \(\pm 2\) 以内)
故,观察到若 \(2b_x<b_y\),一定只会有 \(O(1)\) 个时间区间使得左侧值会等于某一个定值。
再考虑若 \(b_x<b_y\),那么先二分找到第一个区间使得左侧值达到定值,那么缩一下左边的值的连续段,一定长成 \(x-2,x-1,x,x-1,...,x,x-1,x,x+1,x,...,x+1,x,x+1,x+2\) 的样子,且每一个省略号代表的贡献类型所作的贡献是等差数列,随便处理一下贡献就行。 \(\mathcal O(T\log n)\)。
ARC124E Pass to Next \(*3031/_{6.3}\)
有编号为 \(1, 2, \ldots, n\) 的 \(n\) 个人围成一个环形排列,每个人 \(i\) 最初拥有 \(a_i\) 个球。
接下来进行如下操作一次:
- 每个人可以从自己当前拥有的球中选出若干个(可以为 \(0\) 个)。
- 然后,每个人将自己选中的球同时传递给右边的人。
- 形成一个长度为 \(n\) 的数列。数列的第 \(i\) 项等于人 \(i\) 当前拥有的球数。
计算 \(\sum_{x \in S} \prod_{i=1}^{n} x_i\bmod 998244353\)。\(3\le n \le 10^5,0\le a_i\le 10^9\)。
设操作序列 \(x\) 的第 \(i\) 项 \(x_i\) 表示 \(i\) 向 \(i+1\) 传了多少球。容易发现,对于 \(\min x_i\ge 1\) 的操作序列将其每一项都减去 \(1\) 最终结果不会变化。那么,可以说明 \(\min x_i=0\) 的操作序列和所有可能的答案序列构成双射。
套路的,考虑 \(\prod a_i\) 的组合意义为在每个人手中选出 \(1\) 个球的方案数。先不管环的情况,考虑在链上做这个问题。考虑 DP 每个人所选的球是哪里来的,设计 \(f_{i,0/1}\) 表示当前考虑了前 \(i\) 个点,第 \(i\) 个人选择自己 原来的\(/\)别人给的,所有已经确定贡献的方案数,有转移:
ARC126E Infinite Operations \(*2711/_{5.7}\)
给定 \(n,q\) 和一个长度为 \(n\) 的数组 \(a\) 和 \(q\) 组修改,每次修改一个点的值。
每当通过查询修改数列后,请求出下述问题的答案 \(\bmod 998244353\):对于数列 \(A\),进行如下操作 \(n\) 次时,所能获得的总得分最大值记为 \(f(n)\)。
- 选择满足 \(A_i \leq A_j\) 的 \(i, j\),以及满足 \(A_i + 2x \leq A_j\) 的非负实数 \(x\)。
- 将 \(A_i\) 增加 \(x\),将 \(A_j\) 减少 \(x\)。
- 获得 \(x\) 分。
可以证明极限 \(\displaystyle \lim_{n \to \infty} f(n)\) 存在。请计算该值。
\(1\le n,q\le 3\times 10^5\),5s 1GB。
显然最后数组一定全部变成 \(\overline{a}\)。
考虑如何让答案最大。一种构造是将 \(a_i\) 排序后 \(i\rightarrow j\) 拆成 \(i\rightarrow i+1\rightarrow ...\rightarrow j-1\rightarrow j\)。
这时计算贡献,考虑枚举 \(i\rightarrow i+1\) 对答案造成的贡献,可以得到为 \(\sum_{j=i}^n a_j-\overline{a}\)。
改写形式,可以得到总答案为 \(-\frac{n+1}2\sum\limits_{i=1}^n a_i + \sum\limits_{i=1}^n ia_i\)。
左项直接维护,注意此时 \(i\) 为排名,把数放在值域线段树上维护右式即可。
ARC127E Priority Queue \(*2678/_{6.3}\)
有一个初始为空的大根堆,给出一个长度为 \(n+m\) 的操作序列,其中有 \(n\) 个 \(1\),\(m\) 个 \(2\),从前往后遍历该序列,对一个 \(1\sim n\) 的排列 \(p\),按照操作序列进行以下操作:
若操作序列该位为 \(1\),将 \(p\) 的下一个数加入大根堆。
若操作序列该位为 \(2\),删除堆顶。求对于所有的 \(p\),操作完之后,堆中的元素集合有多少种可能,对 \(998244353\) 取模。
\(1\le n\le 5\times 10^3\)。
被神秘结论击杀了。。。
考虑最终剩下的集合如何计数才能不重。
发现对于任何一个合法的排列,将最终剩余的数升序排序后插回一定也是合法的。这启发我们对合法的递增序列计数。
现在要求的就是:求每个数 \(i\) 在 \([i,n]\) 之间且递增的方案数。前缀和优化 DP 可以做到 \(O(nm)\)。
DP 转移:\(f_{i,j}=\sum\limits_{j<k\le n} f_{i+1,k}\),答案即为 \(\sum f_{1,i}\)。
ARC129D -1+2-1 \(*2300/_{5.7}\)
给定一个长度为 \(n\) 的数组 \(a\),将其首位连接视作环。
每次操作可以选择环上 \(3\) 个顺时针相邻的点 \(x,y,z\) 并将 \(a_x,a_z\) 减去 \(1\),将 \(a_y\) 加上 \(2\)。
求最少的次数使得 \(a\) 变为全 \(0\),或报告无解。
\(3\le n\le 5\times 10^5,1\le a_i\le 10^6\)。
这个题好厉害啊。
首先先把 \(\sum a_i\neq 0\) 的判掉。
设 \(c_i\) 为 \(y=i\) 的操作次数。那么,可以写出 \(n\) 个形如 \(c_{i-1}+c_{i+1}-2c_i=a_i\) 的方程。
这个看上去还是不太好解决,考虑解它的差分数组:
现在就可以解出 \(d\) 了。我们发现实际上从 \(d\) 转回 \(c\) 会多出一个自由度,由于我们要最小化答案,找出最小的 \(\sum c\) 使得在满足 \(d\) 的限制的情况下每项都 \(\ge 0\) 即可。复杂度 \(O(n)\)。
这题好像还有 \(O(n\log V)\) 做法说是。
ARC132E Paw \(*3144/_{6.3}\)
其实是 \(*2900\)。
有 \(n\) 个格子,每个格子上写了三个字符 \(\texttt{< > .}\) 中的一个。
玩家按以下方式操作格子:
- 随机选择一个标有 \(\texttt{.}\) 的格子,并站在上面。
- 随机使用 \(\texttt{< >}\) 之一填在格子上。
若填的是 \(\texttt{<}\),那么一直向左走,直到遇到一个 \(\texttt{.}\) 或是超出格子边界,并将路径上的格子全部覆盖成 \(\texttt{<}\)。填的是 \(\texttt{>}\) 则反之。
求出按以上方式填完格子后 \(\texttt{<}\) 的期望个数。\(1\le n\le 10^5\)。
首先有一个高级性质:最后的形态一定形如 \(\texttt{<<<<****}\texttt{>>>>}\),其中中间的\(\texttt{ * }\)表示一段和原序列相同的位置,它们一定是被夹在相邻两个原序列的 \(\texttt{.}\) 中间的。
那么,考虑枚举中间保留的段并求此局面的概率。设 \(f_i\) 为左边的前 \(i\) 个 \(\texttt{.}\) 全部变成 \(\texttt{<}\) 且不影响到右边的方案数。注意到只有第一次就选到 \(i\) 并且方向错误时才会爆掉,于是有转移 \(f_i=f_{i-1}\left(\frac{2n-1}{2n}\right)\)。答案即为 \(\sum_{\text{gap}} f_{\text{l}<}f_{\text{r}{>}}(rk_{\text{gap}}+cnt_{{\text{gap}_<}})\)。
ARC132F Takahashi The Strongest \(*3066/_{6.7}\)
其实是 \(*3200\)。
A,B,C 三人在一起玩石头剪刀布。
他们共进行 \(k\) 轮出牌。每个人都会按照一个预定的策略出牌,可以写作一个长度为 \(k\) 的串。
B 有 \(n\) 个预定策略,C 有 \(m\) 个预定策略。每一盘游戏中,B 和 C 都会在自己的策略集合中随机选择一种策略。
现在你是 A,你要对于每种策略求出只有你获得胜利的概率。
一个人在三人石头剪刀布中获得唯一的胜利的条件是在此之前无人被淘汰且该轮中这个人赢了所有其他的两个人。 \(1\le k\le 12,1\le n,m\le 3^k\)。 5s,1GB。
发现如果每一位独立会好做一点,故转为计数不唯一赢的方案数。此时每一维独立,这个问题形如位运算卷积,在每一位上前两个人的 \(i,j\) 会贡献给第三个人的 \(k\)。
此时有一个问题,一个 \((i,j)\) 会贡献给多个 \(k\),无法表示成运算。具体地,当前两个人出的不同,第三个人任意出都输,否则第三个人有一种出法赢。有一个 trick 是,设三种出法为 \(1\sim 3\),那么我们有 \(4\) 种让自己输的方法,\(\{1,3\},\{1,2\},\{2,3\},\{1,2,3\}\)。。设三种出法为 \(1\sim 3\)。第三个人有四种策略,可以表示为运算 \(x\circ y=\begin{cases}0&\ x\ne y\\ x&\ x=y\end{cases}\)。按这个运算进行四进制 FWT,位矩阵是 \(\begin{bmatrix}1&1&1&1\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix}\)。最后 IFWT 回去,再把策略加到具体的出法上,也就是进行位矩阵为 \(\begin{bmatrix}0&0&0&0\\1&1&0&1\\1&1&1&0\\1&0&1&1\end{bmatrix}\) 的变换。复杂度 \(O(k4^k)\)。
太厉害了 FWT!
ARC135D Add to Square \(*2750/_{5.7}\)
有一个 \(h \times w\) 的网格,每个格子中写有一个整数。对于 \(1 \leq i \leq h\),\(1 \leq j \leq w\),第 \(i\) 行第 \(j\) 列的格子中写的整数记作 \(a_{i,j}\)。
你可以进行如下操作任意次(也可以一次都不做):
- 选择满足 \(1 \leq i \leq h-1\) 且 \(1 \leq j \leq w-1\) 的整数 \(i, j\)。
- 选择一个整数 \(x\)。
- 将 \(a_{i,j}\)、\(a_{i,j+1}\)、\(a_{i+1,j}\)、\(a_{i+1,j+1}\) 都加上 \(x\)。
请你通过若干次操作,使操作后的 \(\sum_{i=1}^h \sum_{j=1}^w |a_{i,j}|\) 尽可能小,并输出操作后 \(\sum_{i=1}^h \sum_{j=1}^w |a_{i,j}|\) 的值,以及此时网格的状态。
\(2 \leq h, w \leq 500,|a_{i,j}| \leq 10^9\)
有对相邻位进行同操作,使用经典 trick,把奇数位取反,此时不论怎么操作每行每列和不变。
可以构造证明,所有和相等的矩阵是可以互相转化的。
设每行每列的和为 \(x_i,y_j\)。显然该问题有下界 \(\max(\sum |x_i|,\sum |y_i|)\)。
不难发现这个下界是可以取到的,下给出构造性证明:
- 不妨设每行元素的绝对值之和大于每列元素的绝对值之和,那么一组解取到下界当且仅当每个元素的符号和其行和符号相等。
- 如果有一行一列同为正,那么在交点处填行和与列和的较小值(同为负同理)。
- 由于行和列和总和相等,因此该过程停止时所有列和一定为 \(0\)。
- 此时找到一正一负的两行,任取一列填绝对值较小值。
每次填数至少使得一行或一列和为 \(0\),操作次数 \(O(n+m)\)。
总复杂度 \(O((n+m)^2)\)
ARC139D Priority Queue 2 \(*2816/_{6.3}\)
给定长度为 \(n\) 的数组 \(a\),值域 \(1\sim m\)。
以下操作重复 \(k\) 次:
- 选择一个 \([1,m]\) 中的整数,加入 \(a\),之后删去 \(a\) 中第 \(x\) 小的元素。
显然,一共有 \(m^k\) 种加数方案。输出所有方案做完操作之后 \(a\) 的和的和。
\(1\le n,m,k\le 2\times 10^3,\ 1\le x\le n+1\)。
发现如果维护值很难维护新加入的东西,考虑将求和改为求对于值域中的每个数,有多少数小于等于它。假设现在在考虑值为 \(y\),初始 \(a\) 中有 \(c\) 个数 \(\le y\)。
现在一次操作即为:
- \(c\) 每次以 \(\frac{m-j+1}m\) 的概率增加 \(1\),若 \(c\ge n-x+1\) 则 \(c\rightarrow c-1\)。
枚举其被增加了 \(z\) 次,容易组合数算出这种变化的概率为 \(\binom{k}{i}(\frac{m-j+1}m)^i(\frac{j-1}m)^{k-i}\),也容易算出最终变成了什么,答案直接统计即可。这一部分的复杂度是 \(O(\log k)\)。
故,总复杂度为 \(O(nm\log k)\)。
ARC128E K Different Values \(*3049/_{6.5}\)
给定一个长度为 \(n\) 的整数序列 \(a\),以及一个整数 \(k\)。
请构造一个整数序列 \(x\),使其同时满足以下两个条件:
- 对于每个整数 \(i\)(\(1 \leq i \leq n\)),\(x\) 中恰好包含 \(a_i\) 个 \(i\),且不包含其他整数。
- 在 \(x\) 中,任意连续的 \(k\) 个元素,其值都互不相同。
请判断是否存在满足条件的序列 \(x\)。如果存在,请输出字典序最小的 \(x\);如果不存在,输出 \(-1\)。
\(2\le k\le n\le 500,1\le a_i,1\le \sum a_i\le 2\times 10^5\)
容易发现同一种颜色的元素最多填 \(\lceil kn\rceil\) 个,并且这样的元素至多 \(n\mod k\) 个。
可以递归证明这个条件是充分的。
将序列分成若干个长度为 \(k\) 的区间和一个长度 \(k'\le k\) 的区间放在最前面使得序列被恰好划分。可以证明有解的充要条件是每一段中每一个数都出现了一次,故构造方案时从小到大找到第一个可以填并且上一次填入位置距离当前位置 \(\ge\) 的元素即可。
时间复杂度 \(O(nm)\)。
ARC141D Non-divisible Set \(*2890/_{6.3}\)
定义一个好的集合满足其中没有任何两个数一个是另一个的倍数。
给定一个大小为 \(n\) 的集合 \(S\),对于其中每个数 \(x\) 判断是否能有一个 \(S\) 的大小为 \(m\) 的子集是好的且包含 \(x\)。
\(1\le m\le n\le 2m\le 6\times 10^5\)
这个套路真无敌了。
考虑将这些正整数分组,具体的,将一个数 \(c\) 写作 \(x\times 2^y\) 的形式,其中 \(x\) 是奇数。我们把这个数放在坐标 \((\frac{x+1}2,y)\) 上。
显然每一个横坐标最多选一个数,并且如果选了 \((x,y)\),那么所有 \((c,d)\) 满足 \(d\ge y,c=kx\) 或 \(y\le d,kc=x\) 的都不再能选(\(k\) 是正整数),而其他的都可以被选择。
有上面的结论之后,考虑证明一个结论,对于某一个横坐标 \(x\) 和三个纵坐标 \(y_1\le y_2\le y_3\),若 \((x,y_1),(x,y_3)\) 合法,那么 \((x,y_2)\) 也合法。证明直接考虑构造,既然 \((x,y_1),(x,y_3)\) 都有合法构造,那么将 \((x,y_1)\) 在 \(x-1\) 前的构造和 \((x,y_3)\) 在 \(x+1\) 后的构造拼上 \((x,y_2)\) 一定可以。
于是我们只需要求出对于每个 \(x\),其能取到的 \(y\) 的上下界。这个扫两遍贪心即可。复杂度 \(O(m\log m)\)。
ARC147E Examination \(*2553/_{5.7}\)
给定 \(n\) 个数对 \((a_i,b_i)\)。一次操作可以选定 \(1\le x,y\le n\) 并交换 \(a_x,a_y\)。
求最少动多少个数对使得对于所有的 \(1\le i\le n\),都有 \(a_i\ge b_i\)。注意一个 \(i\) 被操作多次也只算动了一个数。
\(1\le n\le 3\times 10^5,1\le a_i,b_i\le 10^9\)。
虽然这个题洛谷上是紫,但是我感觉挺简单的。
先不管复杂度想一个 poly 复杂度做法。
先把所有不合法的 \((a_i,b_i)\) 拿出来。它们一定要被交换。于是显然它们内部可以任意重排,将这一部分 \(a,b\) 分别单独降序排序。
现在循环考虑值最大的未被满足的 \((a_x,b_x)\)。此时一定要向这个被交换集合中加数才能使其合法。考虑加入 \(a\) 值 \(\ge a_x\) 中 \(b\) 最小的,容易证明这样贪心的策略是优的,因为选成任意的其他 \((a_y,b_y)\) 一定不会导致下一次决策时间变晚。
这个东西是 \(O(n^2)\) 的,发现我们能优化的地方只有找到想要的 \((a,b)\),想办法用你喜欢的 DS 维护即可,例如值域线段树或堆。复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号