zoukankan      html  css  js  c++  java
  • AT2163 [AGC006B] Median Pyramid Easy

    需要一点灵感的题目。

    可以发现这样一个事情,当三个数中有两个数相同时,中为数一定是这两个相同的数。

    基于这个观察,我们想让每一行都存在这样两个相同的两个数,就一定能保证第一层的值为 (x) 了。

    继续观察可以发现,这样两个相同的数需要紧挨在一起,否则不能保证上面也存在两个相同的 (x)

    那么对于两个在 (p, p + 1) 的相同数 (x),必然能使得下一层的 (p - 1, p) 也均为 (x)(当 (p - 1, p) 在下一层的状态下存在时)。

    那么我们的目标就变为找到一个位置 (p) 使得在向上移动时 (p, p + 1) 总是存在。

    不难发现 (p = n - 1) 即可满足这个条件,于是我们只需要让第二层 (p - 1, p)(x) 即可。

    这个直接构造即可,需要注意的是 (1, 2n - 1) 是无解的,因为这两个数在第二层显然至多只会存在一个,且必为最大值或最小值,因此必然无解。

    同时,需要特判 (n = 2) 的情况。

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i, l, r) for (int i = l; i <= r; ++i)
    const int N = 200000 + 5;
    int n, k, p[N]; bool book[N];
    int read() {
        char c; int x = 0, f = 1;
        c = getchar();
        while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
        while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int main() {
        n = read(), k = read();
        if(k == 1 || k == 2 * n - 1) puts("No");
        else {
            puts("Yes");
            if(n == 2) rep(i, 1, 2 * n - 1) p[i] = i;
            else {
                p[n] = k, book[k] = true;
                if(k == 2 * n - 2) {
                    p[n - 1] = k - 1, p[n + 1] = k + 1, p[n + 2] = k - 2;
                    book[k - 1] = book[k + 1] = book[k - 2] = true;
                }
                else {
                    p[n - 1] = k + 2, p[n + 1] = k - 1, p[n + 2] = k + 1;
                    book[k + 2] = book[k - 1] = book[k + 1] = true;
                }
                int P = 1;
                rep(i, 1, n - 2) {
                    for (; P <= 2 * n - 1 && book[P]; ++P) ;
                    p[i] = P, ++P;
                }
                rep(i, n + 3, 2 * n - 1) {
                    for (; P <= 2 * n - 1 && book[P]; ++P) ;
                    p[i] = P, ++P;
                }
            }
            rep(i, 1, 2 * n - 1) printf("%d ", p[i]);
        }
        return 0;
    }
    

    构造题一定要基于观察下手,一定要思考必然性而不是人脑随机应变。

    GO!
  • 相关阅读:
    22.抽象类
    21.多态
    20.修饰符
    19.继承
    day46---MySQL数据库进阶(一)
    day45---mysql数据库基本操作初阶(二)
    day45---计算机安全项目(癞蛤蟆)
    day44---数据库初阶(一)
    day44---windows下安装MySQL-5.6.37
    day42---几种network IO模型
  • 原文地址:https://www.cnblogs.com/Go7338395/p/13845116.html
Copyright © 2011-2022 走看看