CF361

A. Levko and Table

构造一个 \(n \times n\) 的方阵,使得该方阵每行每列的和均为 \(k\)\(1 \leq n \leq 100\)\(1 \leq k \leq 1000\)。1s / 250M。

对角线上全填 \(k\) 即可。

B. Levko and Permutation

给定 \(n,k\),你需要构造一个 \(1∼n\) 的正整数排列 \(a\),使得集合 \(\{i \mid 1 \leq i \leq n, \gcd(i, a_i) > 1 \}\) 中的元素个数正好等于 \(k\)。输出任意一种解,或者报告无解。\(1 \leq k \leq n \leq {10}^5\)。1s / 250M。

注意到对于任意的 \(i\)\(\gcd(i, i + 1) = 1\),那么构造互质的位置就是容易的。

C. Levko and Array Recovery

你有一个序列,长度为 \(n\)。有 \(m\) 次操作,操作为区间加或者查询区间最大值。现在告诉你每次查询操作的结果,你需要还原出整个序列。\(1 \leq n,m \leq 5000\)。1s / 250M。

每个位置的最大值是容易得出的。那么你只需要每个位置都取这个最大值,最后再验证一遍即可。

D. Levko and Array

给定一个数列 \(a\),你可以做至多 \(k\) 次修改,每次修改可以将数列中的一个数改为另一个数。求经过修改后,\(\max \lvert a_i - a_{i - 1} \rvert\) 的最小值。\(1 \leq n,k \leq 2000\)\(1 \leq a_i \leq {10}^9\)。2s / 250M。

首先二分答案,考虑如何 check。

考虑 DP,设 \(f_i\) 表示对于前 \(i\) 个数,强制不修改 \(i\) 时最少的操作次数。转移形如枚举决策点 \(j\),然后 \([j + 1, i - 1]\) 这段区间全部修改。那么改成什么最好呢?显然,改成等差数列是最好的。这样,合法性是容易判断的。

时间复杂度 \(O(n^2 \log V)\)

E. Levko and Strings

给你一个字符串 \(s\),你需要求出有多少个字符串 \(t\),满足恰好有 \(k\) 个不同的 二元组 \((i, j)\),使得 \(s_{[i, j]} < t_{[i, j]}\)\(1 \leq n, k \leq 2000\)。1s / 250M。

首先,对于位置 \(k\),如果 \(s_k < t_k\),那么显然,所有形如 \((k, ?)\) 的二元组都满足条件,贡献为 \(n - k + 1\)。如果 \(s_k > t_k\),那么所有这样的二元组都不满足条件,贡献为 \(0\)。这样,对于二元组 \((i, j)\),我们大致上可以消去 \(j\) 这一维,只考虑 \(s_i\)\(t_i\) 的大小关系。

但是,如果 \(s_k = t_k\) 呢?我们发现,它的贡献取决于后面的第一个满足 \(s_p \neq t_p\) 的位置 \(p\)。更严谨地说,它的贡献就等于位置 \(p\) 的贡献。换句话说,位置 \(p\) 影响了区间 \([k, p - 1]\),这段区间内的位置满足 \(s_i = t_i\)

那么 DP 就是容易的了。仿照上题的设计思路,设 \(f_{i, j}\) 表示考虑前 \(i\) 个字符,强制 \(s_i \neq t_i\) 时,满足恰好有 \(j\) 个二元组的方案数。转移的话枚举字符全部相同的区间即可。

直接做时间复杂度是 \(O(n^3)\) 的。前缀和优化后时间复杂度来到了 \(O(n^2 \log n)\)\(\log n\) 来源于调和级数。

posted @ 2025-08-27 15:29  Eliauk_FP  阅读(20)  评论(0)    收藏  举报