CF1526 D. Omkar and Medians

Problem - 1536D - Codeforces

 

题意:

给出一个长为n的数组b,问是否存在一个长为2n-1的数组a,满足b[i]是a中前2*i-1个数的中位数

 

设已经确保b中前i个数都满足条件

现在判断b[i+1]是否满足

因为b[i]满足条件,

所以已经构造出了一个a数组,设c是a按升序排列结果,满足c[i]=b[i]

此时c[i]前、后各有i-1个数

若b[i+1]=b[i],加2各b[i]进去即可满足条件

若b[i+1]>b[i],要求b[i+1]和一个未知数加入c数组后,满足b[i+1]=c[i+1],且b[i+1]前、后各有i个数

在没有把b[i+1]加入c数组之前,b[i]后面有i-1个数

现在把b[i+1]和一个未知数加入c数组,要求b[i+1]后面有i个数

又因为b[i+1]一定在b[i]后面

所以原先b[i]后面的i-1个数也都要在b[i+1]后面,再加上那个未知数凑够i个数

即不能存在一个b[j],满足j<i且b[i]<b[j]<b[i+1]

若b[i+1]<b[i],同理可得不能存在一个b[j],满足j<i且b[i+1]<b[j]<b[i]

 

#include<bits/stdc++.h>

using namespace std;

#define N 200004

int a[N]; 
set<int>s;
set<int>::iterator it;

int main()
{
    int T,n;
    bool ok; 
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d",&a[i]);
        s.clear();
        s.insert(a[1]);
        ok=true;
        for(int i=2;i<=n && ok;++i)
        {    
            if(a[i]>a[i-1])
            {
                it=s.upper_bound(a[i-1]);
                if(it!=s.end() && *it<a[i]) ok=false; 
            }
            else if(a[i]<a[i-1])
            {
                it=s.lower_bound(a[i-1]);
                if(it!=s.begin())
                {
                    --it;
                    if(*it>a[i]) ok=false;
                }
            }
            s.insert(a[i]);
        }
        if(ok) printf("YES\n");
        else printf("NO\n");
    } 
}

 

posted @ 2021-11-06 19:54  TRTTG  阅读(46)  评论(0编辑  收藏  举报