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\),请计算以下值:
- 输入均为整数。
- \(2 \le N \le 2 \times 10^5\)
- \(1 \le K \le 300\)
- \(1 \le A_i \le 10^8\)
sol
先看一个固定的 \(L,R\)。
根据二项式定理:
现在不是只有一对 \(L,R\),而是让 \(L,R\) 都从 \(1\) 到 \(N\) 枚举:(先不考虑 \(L < R\) 的限制)
利用二项式定理:
交换求和顺序:
因为 \(L\) 和 \(R\) 是独立枚举的,所以可以拆:
所以:
可以预处理 \(\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\),因此最终要满足
将前半部分拆成差分:
令
则有
即
于是可以递推得到
另一方面,由于下标是循环的,
所以
因此
也可以写成
如果这里算出来的 \(b_1\) 不是整数,那么显然无解。
接下来根据
反推出所有 \(p_i\):
定义前缀量
那么统一写成
由于操作次数必须满足
所以需要
对所有 \(i\) 成立,也就是
因此,为了让总操作次数尽可能小,应当取最小合法的 \(p_1\):
这样就能唯一确定整组最优的 \(p_i\)。
OI / C++ / Algorithm
懒惰者出局。

浙公网安备 33010602011771号