Codeforces Round #641 (Div. 2) D. Orac and Medians

48 篇文章 0 订阅
3 篇文章 0 订阅

思路:如果数组存在k,且存在一个区间[i,i+2],至少有两个数大于等于k,那么必定有解,否则无解

简略证明如下:

1.如果存在这么一个区间,那么要么它都变成k,然后拓展把数组所有数都变成k,要么它都变成x,x>k,然后扩展到k旁边,在由k扩展,全部变成k,例如n=8,k=2,3 1 3 1 1 1 1 2,那么可以变成 3 3 3 3 3 3 3 2,然后变成 2 2 2 2 2 2 2 2

2.如果不存在,那么说明每个[i,i+2]区间最多只有一个数大于等于k,那么任何区间,大于等于k的数都不可能占到一半,所以中位数就不可能变成k

 Slime has a sequence of positive integers a1,a2,…,an

.

In one operation Orac can choose an arbitrary subsegment [l…r]

of this sequence and replace all values al,al+1,…,ar to the value of median of {al,al+1,…,ar}

.

In this problem, for the integer multiset s

, the median of s is equal to the ⌊|s|+12⌋-th smallest number in it. For example, the median of {1,4,4,6,5} is 4, and the median of {1,7,5,8} is 5

.

Slime wants Orac to make a1=a2=…=an=k

using these operations.

Orac thinks that it is impossible, and he does not want to waste his time, so he decided to ask you if it is possible to satisfy the Slime's requirement, he may ask you these questions several times.

Input

The first line of the input is a single integer t

: the number of queries.

The first line of each query contains two integers n (1≤n≤100000)

and k (1≤k≤109), the second line contains n positive integers a1,a2,…,an (1≤ai≤109)

 

The total sum of n

is at most 100000

.

Output

The output should contain t

lines. The i-th line should be equal to 'yes' if it is possible to make all integers k

in some number of operations or 'no', otherwise. You can print each letter in lowercase or uppercase.

Example

Input

Copy

5
5 3
1 5 2 6 1
1 6
6
3 2
1 2 3
4 3
3 1 2 3
10 3
1 2 3 4 5 6 7 8 9 10

Output

Copy

no
yes
yes
no
yes

Note

In the first query, Orac can't turn all elements into 3

.

In the second query, a1=6

is already satisfied.

In the third query, Orac can select the complete array and turn all elements into 2

.

In the fourth query, Orac can't turn all elements into 3

.

In the fifth query, Orac can select [1,6]

at first and then select [2,10]

.

#include <cstdio>
#include<iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include<set>
#include<vector>
using namespace std;
#define ll long long
//#define ll int
//#define maxn 1050
#define maxn 1050000
ll a[maxn],n,k;
ll slove()
{
    if(n==1) return 1;
    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=2&&i+j<=n;j++)
        {
            if(a[i]>=k&&a[i+j]>=k) return 1;
        }
    }
    return 0;
}
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        ll f=0;n,k;
        scanf("%lld %lld",&n,&k);
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            if(a[i]==k) f=1;
        }
        if(f==0)
        {
            printf("no\n");
            continue;
        }
        if(slove()==1) printf("yes\n");
        else printf("no\n");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值