题面
询问(a_1,a_2,cdots a_n)能否通过若干次将任意区间全部赋值为其中位数这个操作,来使得整个序
列全部变为k。(中位数指第(lfloor frac {∣s∣+1} 2 floor)小的数)
多次询问,每次第一行两个整数,(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_igeq 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
。
代码
自己写