题意
每次可选择一段区间,使该段区间等于区间中位数,该操作可进行任意次,问你有没有可能使整段区间等于k
分析
(1)n =1 时,需满足a = k;
(2)n = 2时,需满足两数之中有一个为k且另一个大于等于k;
(3)n > 2时,如果存在子区间满足(2),则该区间也满足
(4)考虑如何构造出一个满足(2)的区间,对于长度>2的区间,只要存在长为3的子区间满足有两个>=k且整段区间存在k,则该区间可构造出(2),因为我们每次从长为3的该段区间开始,使该段区间全部<=k后,向左右两边延展,延展到区间等于k的位置时,即构造成功
(5)代码做了简化,没有单独考虑n = 2
代码
int a[MX];
void solve()
{
int n,k;cin >> n>>k;
rpp(i, n) cin >> a[i];
if(n==1) cout<<(a[1]==k?"yes":"no")<<endl;
else
{
int flag=0;
rpp(i,n) if(a[i]==k) flag=1;
if(flag==0) cout<<"no\n";
else
{
rpp(i,n)
{
int num=0;
rep(j,3) if(a[i+j]>=k) ++num;
if(num>=2)
{
cout<<"yes\n";
return;
}
}
cout<<"no\n";
}
}
}