调整法随记
确定性的调整
1. AGC061 D
首先二分答案 \(k\),记 \(l_{i, j} = \max\{a_{i, j} - k, 1\}, r_{i, j} = a_{i, j} + k\),发现直接构造并不科学,于是考虑调整。
不妨设 \(x_n \le y_m\),反之一样处理。初始令 \(x_i = 1, y_j = +\infty\),每次从 \(1\) 到 \(n\) 遍历 \(x_i\),\(x_i \leftarrow \max\{x_i, x_{i - 1} + 1, \lceil\frac{l_{i, j}}{y_j}\rceil\}\)。然后从 \(m\) 到 \(1\) 遍历 \(j\),\(y_j \leftarrow \min\{y_j, y_{j + 1} - 1, \lfloor\frac{r_{i, j}}{x_i}\rfloor\}\)。做完若合法则直接退出,\(x_n > y_m\) 同样退出。
正确性在于,每时每刻的调整都是必要的,即 \(x_i\) 永远是下界,而 \(y_j\) 永远是上界。考虑分析调整次数,每 \(2\) 次调整必有 \(x_i\) 增加,\(x_n\) 不超过 \(\sqrt{V}\),其中 \(V\) 为答案上界,不超过 \(2\times 10^9\),因此调整次数为 \(O(n\sqrt{V})\)。一次调整时间复杂度 \(O(n^2)\),总时间复杂度 \(O(n^3\sqrt{V}log V)\)。
2. CSP2022模拟赛19 C
若当前的点集 \(S\) 满足 \(|S| = kn\) 且每个点在导出子图中度数 \(< kd\),称这样的点集是满足条件的。考虑把 \(S\) 划分成两个点集 \(T_1, T_2\),其中至少一个满足条件,然后继续递归下去。
先随便构造方案,然后考虑调整:每次交换 \(T_1, T_2\) 中不满足度数限制的两个点 \(u, v\),显然交换后 \(u, v\) 都在各自的集合中满足条件。
正确性显然。考虑分析调整次数,每次调整都会使一端在 \(T_1\),另一端在 \(T_2\) 中的边的数量严格上升,于是调整次数为 \(O(m)\)。一次调整时间复杂度 \(O(kd)\),所以一次划分时间复杂度为 \(O(mkd)\)。每次划分成尽量等大的两个集合,总时间复杂度与第一次划分同阶,为 \(O(mkd)\)。
非确定性的调整
1. WC2023 T2
退火退不过去但调整能调过去。(根据 peehs_moorhsum 在 UOJ 发布的博客,)不难想到先满足最大的社团的限制,然后进行调整。具体的,先猜出无解的充要条件是最大的社团放不下,然后在初始排列中将最大的社团里的元素隔一个随机放两个,剩下的空位随机添。每次随机两个位置交换调整,\(O(n)\) 的计算冲突的连续三元组的个数,若更少则接受,一样则以 \(0.5\) 的概率接受,否则不接受。为了快速判断三个数是否冲突,应先预处理每对 \(i, j\) 共同所在的那一个社团的编号。时间复杂度 \(O(\text{能过})\)。