Problem C. Forsaken City
问题描述
给定一个整数序列 a ,你可以执行以下操作:选择序列的任意一个子序列,并将子序列中的每个元素都减 1。
请计算最少需要多少次操作才能使序列 a 变为非递减序列(即对于所有 ($1 \leq i < n$),都满足 ($a_i \leq a_{i+1}$))。
输入
- 第一行包含一个整数 t($(1 \leq t \leq 10^4$)),表示测试用例的数量。
- 每个测试用例的第一行包含一个整数 n(($1 \leq n \leq 2 \times 10^5$))。
- 接下来一行包含 n 个整数 ($a_1, a_2, \ldots, a_n$)(($0 \leq a_i \leq 10^9$))。
保证所有测试用例的 n 的总和不超过 ($2 \times 10^5$)。
输出
对于每个测试用例,输出最少需要的操作次数。
思路
- 问题分析:每次操作可以选择任意子序列减 1,这意味着对于每个元素,我们可以独立控制它被减多少次(只要不超过其初始值)。要使序列变为非递减,需要确保每个元素不大于它后面的元素。
- 核心观察:
- 我们需要确定每个元素最终的取值 ($b_i$),使得 ($b_i \leq a_i$) 且序列 b 是非递减的。
- 最少操作次数等于最大的 ($a_i - b_i$)(因为每个元素需要被减的次数就是 ($a_i - b_i$))。
- 贪心策略:从后往前遍历序列:
- 最后一个元素的最终值可以保持不变(即 (b_n = a_n))。
- 对于前面的元素 (a_i),其最终值 (b_i) 最多只能是 (b_{i+1})(以保证非递减),同时不能超过 (a_i)。
- 当 ($a_i > b_{i+1}$) 时,需要将 ($a_i$) 减到 ($b_{i+1}$),此时产生的操作次数为($a_i > b_{i+1}$)
- 当 ($a_i \leq b_{i+1}$) 时,无需操作,直接将 ($b_i$) 设为 ($a_i$)。
- 结果计算:在遍历过程中记录最大的操作次数,这就是最少需要的总操作次数。
代码
1 |
|
时间复杂度:($O(n)$) ,其中 n 是序列的长度。我们只需要遍历一次序列即可得到结果。
Problem F. The Correlation
问题描述
给定一个长度为 n 的整数序列 ($a_1, a_2, \ldots, a_n$)。你可以执行不超过 n 次操作:选择一个整数 v,并将每个数 ($a_i$) 更新为 ($|a_i - v|$)。
请找出执行一些操作后,序列中所有不同元素对的绝对差之和的最小值,即最小化 ($\sum_{1 \leq i < j \leq n} |a_i - a_j|$)。
由于答案可能很大,请输出这个最小和对 998244353 取模的结果。
输入
- 第一行包含一个整数 n(($1 \leq n \leq 2 \times 10^5$))。
- 第二行包含 n 个整数 ($a_1, a_2, \ldots, a_n$)(($0 \leq a_i \leq 10^9$))。
输出
输出最小可能的和对 998244353 取模的结果。
思路
- 奇偶性不变性:核心发现是每次操作 ($|a_i - v|$) 不会改变 ($a_i$) 的奇偶性。这是因为:
- 偶数减去任何整数,结果的奇偶性不变
- 奇数减去任何整数,结果的奇偶性不变
- 最小和的构成:
- 设序列中奇数的数量为 b,则偶数的数量为 (n-b)
- 奇数与偶数的差的绝对值至少为 1
- 奇数之间和偶数之间的差可以通过操作变为 0
- 因此最小可能的和为 ($b \times (n-b)$)
- 实现步骤:
- 统计序列中奇数的数量
- 计算奇数数量与偶数数量的乘积
- 返回乘积对 998244353 取模的结果
代码
1 |
|
解释
- 时间复杂度:($O(n)$),仅需一次遍历统计奇数数量
Problem G. Nice Doppelgnger
问题描述
给定一个正偶数 n,构造集合 (${1, 2, \ldots, n}$) 的子集 S,满足:
- ($|S| = \frac{n}{2}$);
- 对任意 ($x, y, z \in S$)(可重复),乘积 $xyz$ 不是完全平方数。
输入包含 t 个测试用例,每个测试用例给定 n,输出满足条件的子集 S。
思路分析
通过分析完全平方数的质因数特征(所有质因数指数为偶数),结合 Liouville 函数 ($\lambda(x)$) 的性质实现构造:
- Liouville 函数定义:对 ($x = p_1^{e_1}p_2^{e_2}\cdots p_k^{e_k}$),($\lambda(x) = (-1)^{\sum e_i}$)。
- 关键性质
- 完全积性:($\lambda(xy) = \lambda(x)\lambda(y)$);
- 平方数的 ($\lambda$) 值为 1(因指数和为偶数)。
构造策略
选择所有 ($\lambda(x) = -1$) 的元素组成子集 S:
- 对任意 ($x, y, z \in S$),($\lambda(xyz) = \lambda(x)\lambda(y)\lambda(z) = (-1)^3 = -1$);
- 因平方数的 ($\lambda$) 值为 1,故 $xyz$ 不可能是平方数,满足条件。
代码
1 |
|
时间复杂度:预处理 ($O(N \log \log N)$),单次查询 ($O(\log N)$),适用于 ($n \leq 10^6$) 的约束。