Codeforces Round #724 (Div. 2) D. Omkar and Medians(数据结构+思维)
题意:
给出一个数组 b b b,问能否构造出一个数组 a a a,满足对于数组 b b b中每个元素 b i b_i bi,数组 a a a的前 2 ∗ i − 1 2*i-1 2∗i−1 个数的中位数是 b i b_i bi 。
题解:
很明显, a 1 a_1 a1 一定等于 b 1 b_1 b1 。从 i i i 到 i + 1 i+1 i+1 的过程中,数组 a a a 会增加两个数,而中位数的变化则分为三种:
1. 1. 1. 往中位数左边增加两个数,则中位数变为左边相邻的数
2. 2. 2. 往中位数右边增加两个数,则中位数变为右边相邻的数
3. 3. 3. 往中位数两边增加一个数,中位数保持不变。
那么我们可以用 s e t set set 给当前已遍历的中位数排序,设当前中位数旁边的数分别为 l l l 和 r r r ,假如新增加一个中位数,判断新中位数是否 ≥ l & & ≤ r \geq l \&\& \leq r ≥l&&≤r ,不满足则一定无法构造。
代码:
#pragma GCC diagnostic error "-std=c++11"
#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int MAXN=2e5+5;
const int inf=0x3f3f3f3f;
int b[MAXN];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>b[i];
        }
        set<int>s;
        s.insert(-inf);
        s.insert(inf);
        s.insert(b[1]);
        auto pos=s.find(b[1]); 
        int flag=0;
        for(int i=2;i<=n;i++){
            if(b[i]>*next(pos)||b[i]<*prev(pos)){
                flag=1;
                break;
            }
            s.insert(b[i]);
            pos=s.find(b[i]);
        }
        if(flag) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
}

 
                
             
         浙公网安备 33010602011771号
浙公网安备 33010602011771号