其他分享
首页 > 其他分享> > [CF1468H] K and Medians - 思维

[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();
}

标签:CF1468H,cout,思维,int,Medians,long,序列
来源: https://www.cnblogs.com/mollnn/p/14399908.html