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

浙公网安备 33010602011771号