题解:CF1468H K and Medians

时间:2021-08-09
本文章向大家介绍题解:CF1468H K and Medians,主要包括题解:CF1468H K and Medians使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题意简析

给定两个序列 \(a,b\)\(b\) 是给定的单调不减的序列。
现在你可以若干次操作,每次操作选择序列 \(a\)\(k\) 个整数,然后删除这 \(k\) 个数里除了他们的中位数的其他 \(k-1\) 个数。问你能否通过若干次操作,得到序列 \(b\)

分析

因为每次操作之后,我们都会去掉 \(k-1\) 个数,那么如果有解则有

\[n-m\equiv0\pmod{k-1} \]

其中 \(n\)\(a\) 的长度, \(m\)\(b\) 的长度。如果不满足,则输出 “NO”。

现在考虑如何判断有解

举个栗子: 第二个样例 \(n=7\)\(m=3\)\(k=3\)\(b_i={1, 5, 7}\) 。我们发现需要把 \(5\) 前面的 \(2, 3, 4\) ,和后面的 \(6\) 给删掉。

再举个梨子: 第四个样例 \(n=13\)\(m=7\)\(k=7\)\(b_i={1,3,5,7,9,11,12}\) 。发现 \(7\) 前面需删 \(2,4,6\) 三个数,后面需删 \(8,10,13\) 三个数。这两种情况都是有解的。

我们猜测,如果有一个数满足:需要删的数中,小于它的数的个数,和大于它的数的个数均大于 \(\frac{k-1}{2}\) ,那么一定有解。

下面是证明。

\(d=\frac{k-1}{2}\) ,假设我们找到一个数 \(p\) , 其中比它小的需要删除的数的个数记作 \(x\) , 比它大的需要删除的数的个数记作 \(y\) 。所以 \(x+y=n-m\equiv0\pmod{k-1}\) 。记 \(x'=x-d\)\(y'=y-d\) , (前后各去掉 \(d\) 个数)所以有

\[x'+y'=x+y-2d=x+y-(k-1) \]

因此

\[x'+y'\equiv0\pmod{k-1} \]

于是我们一定能找到至少一种方法把这 \(x'+y'\) 个数全部删掉(最后一次,可以去序列中借一个数来当中位数)。那么只剩下 \(d+1+d=k\) 个数,我们需要留下的数 \(p\) 正好就是这 \(k\) 个数的中位数。因为,正好有 \(d\) 个数小于它,正好有 \(d\) 个数大于它。最后我们把 \(k-1\) 个数删去就得到了我们想要的序列。

总结

无解的情况只需判断是否满足

\[n-m\equiv0\pmod{k-1} \]

否则,我们统计每个需要保留的数前后,各需要删除几个数,如果有一个数满足需要删除的数中小于它的数的个数,和大于它的数的个数均大于 \(\frac{k-1}{2}\) ,那么一定有解。

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5;
inline int read(){
	int x = 0, f = 1; char c = getchar();
	while (! isdigit(c)) {
		if (c == '-') f = -1;
		c = getchar();
	}
	while(isdigit(c)) {
		x = (x << 3) + (x << 1) + c - '0';
		c = getchar();
	}
	return x * f;
}
int T, n, m, k, tot, d, sum, l, r;
int b[N];
int main(){
	T = read();
	while (T --) {
		bool f = true;
		n = read(), k =read(), m = read();
		for (int i = 1; i <= m; i ++) 
		    b[i] = read();
		if ((n - m) % (k - 1) != 0) {//无解
			printf("NO\n");
			continue;
		}
		tot = 1; d = (k - 1) / 2; sum = n;
		for (int i = 1; i <= m; i ++)
		{
			if (b[i] - i >= d && n - b[i] - m + i >= d){//判断是否有一个数满足条件
			    printf("YES\n");f = false;
				break; 
			}
		}
		if(f) printf("NO\n");//如果这个数不存在,仍无解
	}
	return 0;
}

原文地址:https://www.cnblogs.com/1314cqy/p/15119226.html