1. 程式人生 > 其它 >CF1536D - Omkar and Medians(思維)

CF1536D - Omkar and Medians(思維)

題目

source

題解

對於陣列B,每增加1個數,相當於陣列A增加2個數。設B中上一個數為x,新加的數為y,如果y>x,那麼A增加的兩個均大於等於x;如果y<x,那麼兩個均小於等於x;如果y=x,那麼一個大於等於x一個小於等於x。在連結串列上維護一個指標cur,它始終指向每一步的x。如果y>x,y位於x的右側,cur右移;如果y<x,cur左移;如果相等,cur不動。期間始終保持cur指向x的性質,有一步cur不指向x,說明不可能。
詳見程式碼

#include <bits/stdc++.h>
 
#define endl '\n'
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mp make_pair
#define seteps(N) fixed << setprecision(N) 
typedef long long ll;
 
using namespace std;
/*-----------------------------------------------------------------*/
 
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
#define INF 0x3f3f3f3f
 
const int N = 3e5 + 10;
const double eps = 1e-5;
int arr[N];
 
int main() {
    IOS;
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i++) {
            cin >> arr[i];
        }
        list<int> l;
        l.push_back(arr[1]);
        auto cur = l.begin();
        bool ok = true;
        for(int i = 2; i <= n; i++) {
            if(arr[i] > arr[i - 1]) {
                if(*cur > arr[i]) {
                    ok = false;
                    break;
                }
                if(*cur == arr[i]) continue;
                ++cur;
                if(cur == l.end()) {
                    cur = l.insert(cur, arr[i]);
                } else {
                    if(*cur < arr[i]) {
                        ok = false;
                        break;
                    } else if(*cur > arr[i]) {
                        cur = l.insert(cur, arr[i]);
                    }
                }
 
            } else if(arr[i] < arr[i - 1]) {
                if(*cur < arr[i]) {
                    ok = false;
                    break;
                }
                if(*cur == arr[i]) continue;
 
                if(cur == l.begin()) {
                    cur = l.insert(cur, arr[i]);
                } else {
                    --cur;
                    if(*cur > arr[i]) {
                        ok = false;
                        break;
                    } else if(*cur < arr[i]){
                        ++cur;
                        cur = l.insert(cur, arr[i]);
                    }
                }
            }
        }
        if(ok) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
}