zoukankan      html  css  js  c++  java
  • [CF1468H] K and Medians

    [CF1468H] K and Medians - 思维

    Description

    给定奇数 k 和长度为 n,m 的序列 a,b,序列 a 是 1..n,序列 b 是单调不降的序列。现在可以进行零次或若干次操作,每次操作从 a 中选择 k 个整数,只保留中位数而删除其他数。问是否能做成序列 b。

    Solution

    每次操作可以消去 k-1 个数,所以 (n-m) mod (k-1) != 0 的情况必然是无解的

    消去的最后一步,必然是以 b 序列中的某一元素为中位数进行的

    因此我们得到一个必要条件:存在 i,对这个 bi,a 中 bi 的两侧各有 k/2 个不在 b 序列中的数

    但前面删除的数是任意的,所以只要满足上述条件,我们就可以在保持上述条件成立的情况下,不断减小数的个数,因此这个条件也是充分的

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    void solve()
    {
        int n, k, m;
        cin >> n >> k >> m;
        vector<int> b(m + 2);
        for (int i = 1; i <= m; i++)
            cin >> b[i];
        if ((n - m) % (k - 1))
        {
            cout << "NO" << endl;
        }
        else
        {
            for (int i = 1; i <= m; i++)
            {
                if (b[i] - i >= k / 2 && n - b[i] - m + i >= k / 2)
                {
                    cout << "YES" << endl;
                    return;
                }
            }
            cout << "NO" << endl;
        }
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--)
            solve();
    }
    
  • 相关阅读:
    python实例
    date命令
    unbuntu禁用ipv6
    Oracle学习(一)
    深入浅出区块链笔记
    sqlserver索引
    Go学习(16):网络编程
    Go学习(15):并发与包
    Go学习(14):defer
    Go学习(13):异常
  • 原文地址:https://www.cnblogs.com/mollnn/p/14399908.html
Copyright © 2011-2022 走看看