• CF1349B Orac and Medians——构造题


    题面链接

    题面

    询问(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. 相邻的三个数中只要存在任意两个相等,则将它们进行操作后,均会变为那个相等的数。
    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_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

    代码

    自己写

  • 相关阅读:
    JavaScript二(第一个js程序)
    JavaScript简述一
    选择合适的Linux版本
    jQuery(一)引入
    Java从零开始学零(Java简介)
    正则表达式
    通过Servlet生成验证码图片(转)
    监听器(web基础学习笔记二十二)
    利用Session完成用户的登录和注销
    Spring Security OAuth 2.0
  • 原文地址:https://www.cnblogs.com/bangdexuanyuan/p/13956059.html
Copyright © 2020-2023  润新知