构造好难,想了好久。
先判掉 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; }