1. 程式人生 > 其它 >Codeforces Round #724 (Div. 2) D. Omkar and Medians

Codeforces Round #724 (Div. 2) D. Omkar and Medians

中位數的性質 離散化 樹狀陣列

題意

一個長度為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;
}
未經許可,禁止搬運。