CF1349B Orac and Medians

CF1349B Orac and Medians

首先很容易发现五个性质:

1、序列中不存在 \(k\) 则构造不出来。

2、序列长度为 \(1\) 只需看 \(a_1\) 等不等于 \(k\)

3、序列中有两个 \(k\) 相邻则一定可以构造出来。

4、若存在一个长度为 \(2\) 的子序列 \(k,a_i\),如果\(k \lt a_i\),那么可以把 \(a_i\) 搞成 \(k\),然后就变成性质 \(3\) 了。

5、若存在一个长度为 \(3\) 的子序列 \(k,a_i,k\),那么可以把 \(a_i\) 搞成 \(k\),然后就变成性质 \(3\) 了。

现在考虑除上述情况以外的情况。

比如 \(3 \ 2 \ 2 \ 2 \ 2 \ 2 \ 4 \ 4\),其中 \(k = 3\)。不难发现没有一个子序列的中位数是 \(3\)

那难道这样的情况就构造不出来了吗?其实不然,注意到有两个连续的 \(4\),因此首先可以将序列改写为 \(3 \ 4 \ 4 \ 4 \ 4 \ 4 \ 4 \ 4\),那么就变成性质 \(4\) 了!

再比如 \(3 \ 2 \ 2 \ 2 \ 2 \ 4 \ 2 \ 4\),可以先用性质 \(5\) 改写成 \(3 \ 4 \ 4 \ 4 \ 4 \ 4 \ 4 \ 4\),就又变成性质 \(4\) 了。

因此我们发现,只要序列中存在一个长度为 \(3\) 的子序列,满足至少 \(2\) 个数大于等于 \(k\),就能构造出来。

注意特判 \(n = 1, n = 2​\) 的情况。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
#define int ll
using namespace std;
using ll = long long;
const int N = 2e5 * 2;
int T, n, k;
int a[N];
namespace task{
	void Main(){
		cin >> n >> k;
		int f = 0;
		F(i, 1, n){
			cin >> a[i];
			if(a[i] == k) f = 1;
		}
		if(!f){
			cout << "no\n";
			return ;
		}
		if(n == 1){
			if(a[1] == k) cout << "yes\n";
			else cout << "no\n";
			return ;
		}
		if(n == 2){
			if(min(a[1], a[2]) == k) cout << "yes\n";
			else cout << "no\n";
			return ;
		}
		F(i, 1, n - 2){
			int cnt = (a[i] >= k) + (a[i + 1] >= k) + (a[i + 2] >= k);
			if(cnt >= 2){
				cout << "yes\n";
				return ;
			}
		}
		cout << "no\n";
		return ;
	}
}
signed main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> T;
	while(T --){
		task::Main();
	}
	return fflush(0), 0;
}
posted @ 2025-07-31 15:44  superl61  阅读(7)  评论(0)    收藏  举报