ARC147 总结

很少打 AT 的比赛,结果 \(C\) 都想不出来,\(B\) 差点被踩爆,还是太菜了诶


A

题意:

\(N\le 2e5\) 的序列,每次拿出最大的数 \(a_i\) 和最小的数 \(a_j\),将 \(a_i\bmod a_j\),如果等于零,则删除。问需要多少次序列只剩一个元素

思路:

multiset 维护序列,模拟


B

题意:

\(n\le400\)排列 \(a\),有两个操作:A 交换 \(a_i,a_{i+1}\);B 交换 \(a_i,a_{i+2}\),最后使排列单调上升。要求输出一种方案,使得 \(A\) 操作次数最少

思路:

当一个位置 \(i\) 和这个位置上的数 \(a\),它们的奇偶性不一样时,\(a\) 一定会进行一次 \(A\) 操作,称这些数为“待操作数”

最好的情况下在“待操作数”中,找到一个奇数和偶数,将它们移至相邻,再进行一次 \(A\) 操作让它们脱离“待操作数”

当没有“待操作数”时,我们就可以将所有数用 \(B\) 操作移回对应的位置


C

题意:

有一个 \(n\le 3e5\) 的·序列 \(A\),每个位置 \(i\) 上可以填的数为 \([L_i,R_i]\),现在要计算:

\[\sum_{i=1}^{n-1}\sum_{j=i + 1}^n |A_i-A_j| \]

使其最小

思路:

数放的位置对答案没有影响

假如选出来的序列是有序的,那显然让头和尾的差距越小越好

我们考虑将 \(L,R\) -分别单独拿出来进行排序

每次比较 \(L\) 的最大值 \(x\)\(R\) 的最小值 \(y\),如果有 \(x>y\),那我们就将 \(x\) 放在序列的末尾,\(y\) 放在序列的开头

反之,如果有 \(x\le y\),说明序列剩下没填的位置都可以填上一个填入序列的数字

这个填出来的序列就是最优序列


D

题意:

\(n\le 2e5\)集合序列 \(S_1,S_2,...,S_n\),现在要构造满足一下条件的序列:

  1. \(S_i\) 的元素不可重,且在 \([1,m]\) 之间

  2. 任意 \(i\in [1,n)\),满足恰好有一个元素只属于 \(S_i,~S_{i+1}\) 中的一个

一个序列的贡献为:所有 \(i\in [1,m]\)\(i\) 出现的集合个数的乘积

求出所有序列的贡献和\(\bmod~998244353\)

思路:

构造 \(x_1,x_2,...,x_{n-1}\)\(x_i\) 表示 \(s_i,s_{i+1}\) 之间差的那个数

显然对一种 \(x\) 序列,当我们确定了 \(S_1\),后面的集合也确定了

\(A_i\) 表示当 \(i\) 存在于 \(S_1\) 时,\(i\) 出现的次数;\(B_i\) 表示 \(i\) 不存在于 \(S_1\) 时,\(i\) 出现的次数

显然对于一种 \(x\) 序列,它的答案为:每个数字 \(i\) 选择 \(A_i\) 或者 \(B_i\),求乘积和

我们不难发现,\(A_i+B_i=n\),因为存在于 \(S_1\) 和不存在于 \(S_1\) 恰好互为补集

那么对于一种 \(x\) 序列,它的答案就是 \(n^m\)

我们可以构造出 \(m^{n-1}\) 种不同的 \(x\) 序列

因此最终答案就是 \(m^{n-1}\times n^m\)


E

题意:

有两个 \(n\le 3e5\) 的序列 \(A,~B\),你可以选择交换 \(A\) 中位置 \(i,~j\) 上的数,最终要使任意 \(i\in [1,n]\),都有 \(A_i\ge B_i\)。问最多有多少个位置没有被交换过

如果不存在合法方案,输出 -1

思路:

判非法很简单,就是将 \(A,B\) 分别排序,比较对应位置上的数

但我们考虑换一种方式:我们令 \(cnt_t\) 表示(\(B_i\le t\) 的个数)\(-\)\(A_i\le t\) 的个数)

当存在一个 \(cnt_t<0\) 时,代表这是非法的

当有 \(A_i<B_i\) 时,代表位置 \(i\) 一定会被交换,我们将这些组对都存入 \(v\)

我们只对 \(v\) 计算 \(cnt_t\),当出现 \(cnt_t<0\) 时,我们这时要加入一个 \(A_i>t,~B_i\le t\) 的组队到 \(v\) 中;如果有多个满足条件的组对,优先加入 \(A_i\) 最大的那个(因为这样能更快满足条件)

用优先队列能够 \(O(n\log n)\) 完成

posted @ 2022-09-05 16:21  zuytong  阅读(78)  评论(0编辑  收藏  举报