• 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

    代码

    自己写

  • 相关阅读:
    VUE 引入element ui 样式不生效解决
    Spark项目故障思路整理总结
    Spark-环境安装
    01.Kettle的安装-千亿级数仓环境搭建
    千亿级数仓day01-项目的简介
    Umeng项目day04
    Umengday12-统计指标
    Umengday11-azkaban调度
    Umengday09-hive自定义UDTF函数叉分函数
    Docker配置jdk1.8
  • 原文地址:https://www.cnblogs.com/bangdexuanyuan/p/13956059.html
Copyright © 2020-2023  润新知