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]\),现在要计算:
使其最小
思路:
数放的位置对答案没有影响
假如选出来的序列是有序的,那显然让头和尾的差距越小越好
我们考虑将 \(L,R\) -分别单独拿出来进行排序
每次比较 \(L\) 的最大值 \(x\) 和 \(R\) 的最小值 \(y\),如果有 \(x>y\),那我们就将 \(x\) 放在序列的末尾,\(y\) 放在序列的开头
反之,如果有 \(x\le y\),说明序列剩下没填的位置都可以填上一个填入序列的数字
这个填出来的序列就是最优序列
D
题意:
有 \(n\le 2e5\) 个集合序列 \(S_1,S_2,...,S_n\),现在要构造满足一下条件的序列:
-
\(S_i\) 的元素不可重,且在 \([1,m]\) 之间
-
任意 \(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)\) 完成