C/C++教程

cf1468H. K and Medians

本文主要是介绍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. K and Medians的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!