zoukankan      html  css  js  c++  java
  • 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");
        } 
    }
    作者:xxy
    本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
  • 相关阅读:
    对于Sobel算子的学习
    HDU 2594(求最长公共前后缀 kmp)
    HDU 6108(整除判断 数学)
    HDU 5968(异或计算 暴力)
    HDU 5963(游戏 博弈+规律)
    简单算法考题记录
    flex与bison
    C++ 智能指针
    Linux 添加设备驱动程序
    Linux 添加系统调用
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/15518167.html
Copyright © 2011-2022 走看看