CF1536D - Omkar and Medians(思維)
阿新 • • 發佈:2021-07-17
題目
題解
對於陣列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; } }