Codeforces 1350 D. Orac and Medians_数组

题意:

给定一个操作,可以使任意一个子区间的数变为该子区间的中位数,问可不可以使得序列最后都变为 Codeforces 1350 D. Orac and Medians_数组_02

如果数组里有k并且有俩个相邻的,大于等于 Codeforces 1350 D. Orac and Medians_数组_02 的数字距离小于等于 Codeforces 1350 D. Orac and Medians_数组_04 ,就是 Codeforces 1350 D. Orac and Medians_中位数_05。可以这样考虑如果满足上面的条件是不是可以通过选择区间大小为 Codeforces 1350 D. Orac and Medians_数组_04 或者 Codeforces 1350 D. Orac and Medians_中位数_07 的变成大于等于 Codeforces 1350 D. Orac and Medians_数组_02 的元素,你可以这样考虑如果满足上面的条件是不是可以通过选择区间大小为 Codeforces 1350 D. Orac and Medians_数组_04 或者 Codeforces 1350 D. Orac and Medians_中位数_07 的变成大于等于 Codeforces 1350 D. Orac and Medians_数组_02 的元素,最后全部的元素是不是就只有两个,或者一个,那就是大于等于 Codeforces 1350 D. Orac and Medians_数组_02 的还有 Codeforces 1350 D. Orac and Medians_数组_02 ,然后就可以全部变成 Codeforces 1350 D. Orac and Medians_数组_02

AC代码:

const int N = 2e5 + 10;
int n, k;
int a[N];
bool flag, ok;
int ans, cnt, res, tmp;

int main()
{
int t;
sd(t);
while (t--)
{
sdd(n, k);
flag = true;
ok = true;
rep(i, 1, n)
{
sd(a[i]);
if (a[i] != k)
flag = false;
else
ok = false;
}
if (ok)
{
puts("no");
continue; //都不相同
}
rep(i, 1, n - 1)
{
if (a[i] >= k)
{
if (a[i + 1] >= k || (i <= n - 2 && a[i + 2] >= k))
{
flag = true;
break;
}
}
}
if (flag)
puts("yes");
else
puts("no");
}
return 0;
}