标签:else script with 条件 oid ++ rip 整数 int
给定奇数 k 和长度为 n,m 的序列 a,b,序列 a 是 1..n,序列 b 是单调不降的序列。现在可以进行零次或若干次操作,每次操作从 a 中选择 k 个整数,只保留中位数而删除其他数。问是否能做成序列 b。
每次操作可以消去 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();
}
标签:else script with 条件 oid ++ rip 整数 int
原文地址:https://www.cnblogs.com/mollnn/p/14399908.html