cf1468H. K and Medians
题解
构造好难,想了好久。
先判掉 $n-m$ 不是 $k-1$ 的倍数。
考虑到最后一次删数一定是原本序列中的 $b$ ,左右两侧各有 $\frac{k-1}{2}$ 个点。
然后发现可以保留一些点变为 $b$ ,使得回到刚刚的问题。
因此只要判断是否存在一个 $b$ ,使得左右两侧都至少有 $\frac{k-1}{2}$ 个点即可。
启发:可以从最后一步入手。
代码
#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; }