题目地址
https://codeforces.com/problemset/problem/1832/D2
题目抽象
给一个长度为 n 的数组 a,一开始每个数字都是红色
你可以对数组进行多次操作,在第 i (下标从1开始)次操作时,可以选择数组中任意一个数字
- 如果这个数字是红色,则增加 i,并将颜色改为蓝色
- 如果这个数字是蓝色,则减少 i,并将数字改为红色
接下来有 q 次询问:
- 当对数组进行正好 k 次操作时,数组的最小值最大可以是多少?
题目类型
二分,构造,数学归纳
解题思路
Step1. 二分答案
题目要求最小值最大,那么我们应该尽可能需要让数组的最小值变大
那么至少变大的到程度合适呢?很难直接通过计算得出这个值
我们可以尝试二分答案(二分答案的原理在这篇文章中有介绍)
我们将询问换个方式:
找一个最大的数 x,使其匹配如下条件:经过 k 次操作后,数组的最小值大于等于 x
然后证明是否符合二分性:
将k次操作后的最小值记为 m i n k min_k mink
已知 m i n k ≥ x min_k \ge x mink≥x,对于任意小于 x 的 y,一定也符合 m i n k > y min_k > y mink>y
可以用二分答案的方式来简化问题
Step 2. 观察 - 假设 - 证明
经过二分答案,问题就简化为:判断 经过 k 次操作后,数组的最小值是否大于等于 x
我们目的是让数组中的元素经过 k 次操作后都大于等于 x,意味着需要构造一个操作序列
Tips
通常构造题就是观察一些规律,然后构造符合约束的解,有两部分
- 寻找规律(证明规律)
- 将构造的方式进行实现
构造题往往有很多种构造方式,需要在规律和实现上寻找一个平衡,这个规律不能太难总结和验证,编码不能太难实现
下面的规律+实现不一定是最简单的,但应该是很容易理解(只要有加减乘除的数学基础都能很容易理解)
我们尝试用一些例子来进行观察,比如 n = 1 时的现象, k <= n 时的现象, 1个数字被多次操作的现象
可以得到以下假设:
- 一个元素 a i a_i ai,最大可以变成 a i + k a_i+k ai+k,既只将最后一次操作分配给它
- 一个元素被操作奇数次,结果一定比原先的大
- 一个元素被操作偶数次,结果一定比原先的小
- 每两次操作,至少会让一个元素减少1
tips
一般比赛的时候不要求严格证明,证明起来比较耗费时间
我们将原数字记为 x,k次操作分别记为 K 1 , K 2 . . . K k K_1,K_2...K_k K1,K2...Kk
证明1
既需要证明 x + K k > x + ∑ i = 1 k ( − 1 ) ⋅ ( i & 1 ) ⋅ K i , k > 1 x+K_k > x+\sum_{i=1}^k(-1)\cdot (i\&1)\cdot K_i, k > 1 x+Kk>x+∑i=1k(−1)⋅(i&1)⋅Ki,k>1
- 当 k 是偶数时,由证明3可得, ∑ i = 1 k ( − 1 ) ⋅ ( i & 1 ) ⋅ K i < 0 \sum_{i=1}^k(-1)\cdot (i\&1)\cdot K_i<0 ∑i=1k(−1)⋅(i&1)⋅Ki<0,所以上述判断成立
- 当 k 是奇数,我们将 ∑ i = 1 k ( − 1 ) ⋅ ( i & 1 ) ⋅ K i \sum_{i=1}^k(-1)\cdot (i\&1)\cdot K_i ∑i=1k(−1)⋅(i&1)⋅Ki分为以下几组:
( K 1 − K 2 ) (K_1-K_2) (K1−K2), ( K 3 − K 4 ) (K_3-K_4) (K3−K4), … ( K k ) (K_k) (Kk)
∵ K k > K k − 1 > . . . > K 2 > K 1 > 0 \because K_k > K_{k-1} > ... > K_2 > K_1 > 0 ∵Kk>Kk−1>...>K2>K1>0
∴ K 1 − K 2 < 0 \therefore K_1-K_2 < 0 ∴K1−K2<0, K 3 − K 4 < 0 K_3-K_4<0 K3−K4<0… K k − 2 − K k − 1 < 0 K_{k-2}-K_{k-1}<0 Kk−2−Kk−1<0
∴ ∑ i = 1 k ( − 1 ) ⋅ ( i & 1 ) ⋅ K i < K k \therefore \sum_{i=1}^k(-1)\cdot (i\&1)\cdot K_i < K_k ∴∑i=1k(−1)⋅(i&1)⋅Ki<Kk
∴ \therefore ∴ 上述判断成立
证明2
既需要证明 x + ∑ i = 1 k ( − 1 ) ⋅ ( i & 1 ) ⋅ K i > x , k 是奇数 x + \sum_{i=1}^k(-1)\cdot (i\&1)\cdot K_i > x, k 是奇数 x+∑i=1k(−1)⋅(i&1)⋅Ki>x,k是奇数
由于 k 是奇数,所以我们可以将