CF1350D Orac and Medians(找规律)

题意:

给出一个序列,每次操作可以选择一段子序列,使得里面的最小的比中位数大的值为t,子序列所有的值都变成这个t。(子序列长度len,中位数(len+1)/2)。

现在给出一个数k,询问能否通过操作把整个序列变成k。

题解:

找规律可以发现,我们需要序列里有一个数是k,同时需要存在两个大于等于k的数同时它们之间的距离要小于等于2。

对n是1的情况特判一下。

#include<bits/stdc++.h>
 
using namespace std;
const int maxn=1e5+100;
int a[maxn];
int n,k;
int main () {
    int t;
    cin>>t;
    while (t--) {
        cin>>n>>k;
        for (int i=1;i<=n;i++) cin>>a[i];
        if (n==1) {
            if (a[1]==k) printf("yes\n");
            else printf("no\n");
            continue;
        }
        int f=0;
        for (int i=1;i<=n;i++) if (a[i]==k) f=1;
 
        if (!f) {
            printf("no\n");
            continue;
        }
        f=0;
        int pre=0;
        for (int i=1;i<=n;i++) {
            if (pre&&a[i]>=k&&i-pre<=2) {
                //printf("%d %d\n",pre,i);
                f=1;
            }
            if (a[i]>=k) pre=i;
        }
        if (!f) printf("no\n");
        else printf("yes\n");
    }
}

 

posted @ 2020-05-23 15:17  zlc0405  阅读(223)  评论(0编辑  收藏  举报