CF1349B Orac and Medians——构造题
题面
询问\(a_1,a_2,\cdots a_n\)能否通过若干次将任意区间全部赋值为其中位数这个操作,来使得整个序
列全部变为k。(中位数指第\(\lfloor \frac {∣s∣+1} 2 \rfloor\)小的数)
多次询问,每次第一行两个整数,\(n\)和\(k\);第二行nn个整数,\(a_1,a_2,\cdots a_n\)
数据范围:\(1 \le n \le 10^5,1 \le k \le 10^9,\),并保证所有询问中\(n\)的和不超过\(10^5\)。
思路
首先要特判一下(样例很良心,全都给出来了)\(n=1\) 或没有 \(a_i=k\) 的情况。
接下来有三个结论:
- 相邻的三个数中只要存在任意两个相等,则将它们进行操作后,均会变为那个相等的数。
- 相邻的两个数进行操作后会变为较小的那个数。
- 根据结论 1,只要数列中存在两个相邻的 \(k\),那么必定是
Yes。
我们可以找到两个相邻的且 \(\ge k\) 的数,操作它们。容易发现,操作之后,它们仍然 \(\ge k\),但变得相等。
然后使用结论 \(1\),不断地进行操作,将某一个 \(k\) 的左侧或者右侧修改为 \(\ge k\) 的数。
例如 \(n=7,k=3\),\(a=[3~2~2~2~2~5~4]\)
- 用结论 \(2\) 对 \([6,7]\) 进行操作,变成 \([3~2~2~2~2~4~4]\)
- 用结论 1 不断地进行操作:
- 操作 \([5,7]\) 后:\([3~2~2~2~4~4~4]\)
- 操作 \([4,6]\) 后:\([3~2~2~4~4~4~4]\)
最后,变成 \([3~4~4~4~4~4~4]\),\(a_1\)的右侧有了 \(\geq k\) 的数。
这个时候就可以用结论 2 制造出两个相邻的 \(k\) 了!上面提到过,有了两个相邻的 \(k\),必定是 Yes。
综上,如果存在 \(1<i \leq n\) 使得 \(a_{i-1} ,a_i\geq k\),则答案是 Yes。
但考虑下面这种情况:
\(n=7,k=3\),\(a=[2,3,2,2,4,2,5]\)。按照上面的做法,是 No,但应该是 Yes,因为可以操作 \([5,7]\) 得
到相邻的 \(\geq k\) 的数。
于是还有一种情况:存在 \(1<i<n\) 使得 \(a_{i-1},a_{i+1}\)\(\geq k\),则答案是 Yes。
代码
自己写

浙公网安备 33010602011771号