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;
}

 

posted @ 2021-11-10 23:54  xjqxjq  阅读(30)  评论(0编辑  收藏  举报