CF1349B Orac and Medians 题解
解题思路
一个比较显然的结论:
- 若序列中存在一段连续的长度大于 \(1\) 的区间,且区间中的数均为 \(k\),那么一定可以将整个序列转化为 \(k\)。
进一步的,我们可以推出,若序列中有一段区间的中位数为 \(k\),那么这个序列一定可以全部转化为 \(k\)。
最后特判 \(n=1\) 和序列中没有 \(k\) 的情况即可。
AC 代码
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define N 100005
#define inf 2e9+7
int n,k,a[N],p[N],ce;
int l[N],r[N],cl,cr;
inline void work(){
scanf("%d%d",&n,&k);ce=0;
for(register int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(register int i=1;i<=n;++i)
if(k==a[i]) p[++ce]=i;
if(!ce){puts("No");return;}
if(n==1){puts("Yes");return;}
for(register int i=1;i<=ce;++i){
int now=p[i];
if(now>1&&a[now-1]>=k){
puts("Yes");return;
}
else if(now<n&&a[now+1]>=k){
puts("Yes");return;
}
}
for(register int i=1;i<n;++i)
if(a[i]>=k&&a[i+1]>=k){
puts("Yes");return;
}
for(register int i=2;i<n;++i)
if(a[i-1]>=k&&a[i+1]>=k){
puts("Yes");return;
}
puts("No");
}
signed main(){
int T;scanf("%d",&T);
while(T--) work();
}