Codeforces Round #641 (Div. 2)的其他题解点我
D. Orac and Medians
题目大意:
给出n个数的序列,定义一个操作,将区间[l , r]内的数都变成其中位数
区间大小为偶数时取偏左边那个
问能否将n个数都变成k
思路:
一道贪心,首先肯定要满足至少存在一个k
然后要出现连续3个数中至少有两个数大于等于k,出现一次即可
首先对于3个数中至少有两个数大于等于k,我们就可以使这3个数都大于等于k,然后不断的使其他数都大于等于k。
如果等于k,那更好,对于大于k的,我们用一个与其相邻的k构成一个区间进行操作,因为他大于k,所以两个数都变成k,这样就可以让所有数都变成k了,反之则不行
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const int maxn = 2e5 + 3;
int a[maxn];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, k;
int flag = 0;
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if (a[i] == k)flag = 1;
}
if (!flag) {
printf("NO\n");
}
else {
if (n == 1)printf("YES\n");
else {
flag = 0;
for (int i = 1; i < n; i++) {
if (a[i] >= k) {
if (a[i + 1] >= k || (a[i + 2] >= k && i + 2 <= n)) {
flag = 1;
break;
}
}
}
if (flag)printf("YES\n");
else printf("NO\n");
}
}
}
}