题目:click
题意:给一段长度为n的区间,你可以操作一段区间排完序之后取这个区间的中位数,这段区间全变中位数的值。问能否把1-n都变为k值。
一开始读错题目了,极其**,注意是一段有序区间的中位数。一开始想先找到k的坐标,找到第一个小于他的数在对个数进行分析判断,但它可以变为比k大的数思路错误。一步步分析,sum为区间中等于k的个数,sum=0时无解,sum=1直接判断,其余情况当等于k的值连续两个,可直接由他展开更新全区间,作为切入点,同理当大于k的连续可展开到等于k的地方,只要区间等于3的大于等于k的个数大于2同理展开。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int MAXN=262144*2+10;
const double PI=acos(-1.0);
const long double eps=1e-12;
int a[100100];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k,i,j;
int sum=0;
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==k)
{
sum++;
}
}
if(sum==0)
{
printf("no\n");
continue;
}
if(n==1&&a[1]==k)
{
printf("yes\n");
continue;
}
if(n==1&&a[1]!=k)
{
printf("no\n");
continue;
}
a[0]=a[n+1]=0;
bool flag=false;
for(i=1;i<=n;i++)
{
if((a[i]==k&&i+1<=n&&a[i+1]==k)||(a[i]>=k&&a[i+1]>=k&&i+1<=n))
{
flag=true;
break;
}
if(a[i]>=k)
{
for(j=1;j<=2;j++)
{
if(a[i+j]>=k&&i+j<=n)
{
flag=true;
break;
}
if(a[i-j]>=k&&i-j>=1)
{
flag=true;
break;
}
}
if(flag)
break;
}
}
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}