cf1468H. K and Medians
作者:互联网
题目描述
题解
构造好难,想了好久。
先判掉 n − m n-m n−m 不是 k − 1 k-1 k−1 的倍数。
考虑到最后一次删数一定是原本序列中的 b b b ,左右两侧各有 k − 1 2 \frac{k-1}{2} 2k−1 个点。
然后发现可以保留一些点变为 b b b ,使得回到刚刚的问题。
因此只要判断是否存在一个 b b b ,使得左右两侧都至少有 k − 1 2 \frac{k-1}{2} 2k−1 个点即可。
启发:可以从最后一步入手。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int T,n,k,m,t,g[N],p[N],b[N];
void work(){
scanf("%d%d%d",&n,&k,&m);
for (int i=1;i<=n;i++) p[i]=0;
for (int i=1;i<=m;i++)
scanf("%d",&b[i]),p[b[i]]=1;
if ((n-m)%(k-1)){
puts("NO");return;
}
t=0;k=(k-1)>>1;
for (int i=1;i<=n;i++){
if (!p[i]) t++;
else if (t>=k && n-m-t>=k){
puts("YES");return;
}
}
puts("NO");
}
int main(){
for (scanf("%d",&T);T--;work());
return 0;
}
标签:cf1468H,return,个点,puts,NO,int,Medians,frac 来源: https://blog.csdn.net/Johnny817/article/details/121259506