其他分享
首页 > 其他分享> > 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,return,个点,puts,NO,int,Medians,frac
来源: https://blog.csdn.net/Johnny817/article/details/121259506