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 @   TRTTG  阅读(49)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2017-11-06 2017 清北济南考前刷题Day 5 afternoon
2017-11-06 2017 清北济南考前刷题Day 5 morning
2017-11-06 2017 清北济南考前刷题Day 4 afternoon
2017-11-06 2017 清北济南考前刷题Day 4 morning
2017-11-06 2017 清北济南考前刷题Day 3 morning
点击右上角即可分享
微信分享提示