ARC 好题精选 1

AT_arc111_c [ARC111C] Too Heavy

\(N\) 个人,编号为 \(1\)\(N\),以及 \(N\) 个编号同样为 \(1\)\(N\) 的行李。第 \(i\) 个人的体重为 \(a_i\),第 \(j\) 个行李的重量为 \(b_j\)。一开始,第 \(i\) 个人拿着编号为 \(p_i\) 的行李。你可以进行如下操作若干次(可以为 \(0\) 次),使得最终每个人都拿着与自己编号相同的行李。

  • 选择 \(i, j\ (i \neq j)\),交换第 \(i\) 个人和第 \(j\) 个人手中的行李。

但是,如果某个人拿着的行李重量大于等于自己的体重,他就会感到疲劳,之后不能再参与任何操作(即不能再被选为 \(i\)\(j\))。特别地,如果 \(a_i \leq b_{p_i}\),那么这个人一开始就无法参与任何操作。

请判断是否存在满足条件的操作序列。如果存在,请构造一个操作次数最少的方案。

其中 \(K\) 为操作次数,\(i_t, j_t\) 表示第 \(t\) 次操作选择的两个人的编号。

如果有多种方案,输出任意一种均可。

  • \(1 \leq N \leq 200000\)
  • \(1 \leq a_i, b_i \leq 10^9\)
  • \(p\)\(1, \ldots, N\) 的一个排列

sol

考虑 \(i\)\(p_i\) 连边,一定得到多个互不相交的多元环。

如果某个 \(i\) 已经拿对了,即 \(p_i=i\) 那么就是一个自环:\(i \to i\),可以认为它已经解决,不需要操作。

从一个 \(a_i\) 最小的点开始操作,肯定不会阻挡后面的点进行操作。

实际上实现时不需要每次重新找最小值,直接把所有点按照 \(a_i\) 从小到大排序,然后依次处理即可。

AT_arc106_d [ARC106D] Powers

给定一个长度为 \(N\) 的整数序列 \(A = (A_1, A_2, \cdots, A_N)\) 和一个整数 \(K\)

对于每一个满足 \(1 \le X \le K\) 的整数 \(X\),请计算以下值:

\[\left(\sum_{L=1}^{N-1} \sum_{R=L+1}^{N} (A_L + A_R)^X\right) \bmod 998244353 \]

  • 输入均为整数。
  • \(2 \le N \le 2 \times 10^5\)
  • \(1 \le K \le 300\)
  • \(1 \le A_i \le 10^8\)

sol

先看一个固定的 \(L,R\)

根据二项式定理:

\[(A_L+A_R)^X = \sum_{j=0}^{X} \binom Xj A_L^jA_R^{X-j} \]

现在不是只有一对 \(L,R\),而是让 \(L,R\) 都从 \(1\)\(N\) 枚举:(先不考虑 \(L < R\) 的限制)

\[\sum_L\sum_R(A_L+A_R)^X \]

利用二项式定理:

\[= \sum_L\sum_R \sum_{j=0}^{X} \binom Xj A_L^jA_R^{X-j} \]

交换求和顺序:

\[= \sum_{j=0}^{X} \binom Xj \sum_L\sum_R A_L^jA_R^{X-j} \]

因为 \(L\)\(R\)独立枚举的,所以可以拆:

\[\sum_L\sum_R A_L^jA_R^{X-j} = \left(\sum_L A_L^j\right) \left(\sum_R A_R^{X-j}\right) \]

所以:

\[= \sum_{j=0}^{X} \binom Xj \left(\sum_L A_L^j\right) \left(\sum_R A_R^{X-j}\right) \]

可以预处理 \(\left(\sum_i A_i^X\right)\)

考虑将答案变为 \(L < R\) 的形式,去掉 \(L = R\) 的部分再除以二即可。

AT_arc129_d [ARC129D] -1+2-1

给定一个长度为 \(N\) 的整数序列 \(A=(A_1,A_2,\cdots,A_N)\)

你可以任意次数重复以下操作:

  • 选择一个整数 \(i\)\(1 \leq i \leq N\)),并分别对 \(A_{i-1},A_i,A_{i+1}\) 加上 \(-1,2,-1\)。这里,\(A_0\) 视为 \(A_N\)\(A_{N+1}\) 视为 \(A_1\)

请判断是否可以将 \(A\) 的所有元素都变为 \(0\),如果可以,请求出所需的最小操作次数。

  • \(3 \leq N \leq 200000\)
  • \(-100 \leq A_i \leq 100\)
  • 输入的所有值均为整数

sol

\(p_i\) 表示位置 \(i\) 被选择的次数。

一次选择 \(i\),会使当前位置增加 \(2\),相邻两个位置各减少 \(1\),因此最终要满足

\[2p_i-p_{i-1}-p_{i+1}+A_i=0 \]

将前半部分拆成差分:

\[(p_i-p_{i-1})-(p_{i+1}-p_i)+A_i=0 \]

\[b_i=p_{i+1}-p_i \]

则有

\[b_{i-1}-b_i+A_i=0 \]

\[b_i=b_{i-1}+A_i \]

于是可以递推得到

\[b_2=b_1+A_2 \]

\[b_3=b_1+A_2+A_3 \]

\[\cdots \]

\[b_n=b_1+A_2+A_3+\cdots+A_n \]

另一方面,由于下标是循环的,

\[\sum_{i=1}^{n}b_i = \sum_{i=1}^{n}(p_{i+1}-p_i) =0 \]

所以

\[0 = n \times b_1+ \left( A_2+(A_2+A_3)+\cdots+(A_2+A_3+\cdots+A_n) \right) \]

因此

\[b_1= -\frac{ A_2+(A_2+A_3)+\cdots+(A_2+A_3+\cdots+A_n) }{n} \]

也可以写成

\[b_1= -\frac{ (n-1)A_2+(n-2)A_3+\cdots+A_n }{n}. \]

如果这里算出来的 \(b_1\) 不是整数,那么显然无解。


接下来根据

\[b_i=p_{i+1}-p_i \]

反推出所有 \(p_i\)

\[p_2=p_1+b_1 \]

\[p_3=p_2+b_2=p_1+b_1+b_2 \]

\[\cdots \]

\[p_n=p_1+\sum_{i=1}^{n-1}b_i \]

定义前缀量

\[s_1=0 \]

\[s_i=\sum_{j=1}^{i-1}b_j\qquad (i\ge 2) \]

那么统一写成

\[p_i=p_1+s_i. \]

由于操作次数必须满足

\[p_i\ge 0, \]

所以需要

\[p_1+s_i\ge 0 \]

对所有 \(i\) 成立,也就是

\[p_1\ge -\min_i s_i \]

因此,为了让总操作次数尽可能小,应当取最小合法的 \(p_1\)

\[p_1=-\min_i s_i \]

这样就能唯一确定整组最优的 \(p_i\)

posted @ 2026-09-02 22:43  easy42  阅读(8)  评论(0)    收藏  举报