码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1468H] K and Medians - 思维

时间:2021-02-16 12:36:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:else   script   with   条件   oid   ++   rip   整数   int   

[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] K and Medians - 思维

标签:else   script   with   条件   oid   ++   rip   整数   int   

原文地址:https://www.cnblogs.com/mollnn/p/14399908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!