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. 相邻的三个数中只要存在任意两个相等,则将它们进行操作后,均会变为那个相等的数。
  2. 相邻的两个数进行操作后会变为较小的那个数。
  3. 根据结论 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

代码

自己写

posted @ 2020-11-10 21:12  邦的轩辕  阅读(45)  评论(0)    收藏  举报