Codeforces Round #724 (Div. 2) D. Omkar and Medians
阿新 • • 發佈:2021-07-30
中位數的性質 離散化 樹狀陣列
題意
一個長度為2n-1的數列a,依次求出前1,3,5,...項的中位數,構成新的數列b,給一個b,問是否合法(即找到對應的a)
每次延長2項,即新增2項到數列中,中位數最多隻會移動一位(都在左邊,向右移動一位,都在右邊,向左移動一位,一左一右,中位數不變)
對於b[i],檢查b[1]~b[i-1]是否出現在(b[i],b[i+1])的區間內即可
離散化+樹狀陣列
未經許可,禁止搬運。#include<bits/stdc++.h> using namespace std; int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f; } const int MAXN = 200005; int n; int a[MAXN]; int sav[MAXN]; int t[MAXN],cnt[MAXN]; void upd(int x,int y){ for(int i=x;i<=n;i+=i&-i) t[i]+=y; } int query(int x){ int ret=0; for(int i=x;i>0;i-=i&-i) ret+=t[i]; return ret; } int L[MAXN],R[MAXN],E[MAXN]; bool solve(){ n=rd(); int Li=0,Ri=0; for(int i=1;i<=n;i++) sav[i]=a[i]=rd(); for(int i=0;i<=n;i++){ t[i]=cnt[i]=L[i]=R[i]=E[i]=0; } sort(sav+1,sav+1+n); int tot=unique(sav+1,sav+1+n)-sav-1; for(int i=1;i<=n;i++) a[i]=lower_bound(sav+1,sav+1+tot,a[i])-sav; for(int i=1;i<n;i++){ int x=a[i],y=a[i+1]; if(x>y) swap(x,y); x++;y--; if(query(y)-query(x-1)>0) return 0; upd(a[i],1); } return 1; } int main(){ int T=rd(); while(T--) if(solve()) puts("YES"); else puts("NO"); return 0; }