Codeforces Round #724 (Div. 2) D .Omkar and Medians(中位数,构造)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #724 (Div. 2) D .Omkar and Medians(中位数,构造)相关的知识,希望对你有一定的参考价值。

LINK

考虑增量构造

因为 b i − 1 b_{i-1} bi1 a 1 , a 2 . . . a i − 1 . . . a 2 i − 3 a_1,a_2...a_{i-1}...a_{2i-3} a1,a2...ai1...a2i3的中位数

c c c数组为 a a a排序后的数组

那么 c i − 1 = b i − 1 c_{i-1}=b_{i-1} ci1=bi1

考虑现在在数组中增加两个数字,使得 b i b_{i} bi成为新的中位数

若添加的两个数都比 c i − 1 c_{i-1} ci1大,那么中位数往右边移动一位,若都比 c i − 1 c_{i-1} ci1小,那么中位数往左边移动一位

若一大一小,中位数仍然是 c i − 1 c_{i-1} ci1

这样我们可以得到, b i < c i − 2 b_{i}<c_{i-2} bi<ci2 b i > c i b_i>c_i bi>ci必然无解

那么得到 b i ∈ [ c i − 2 , c i ] b_i\\in[c_{i-2},c_i] bi[ci2,ci]

这就意味着 b i b_i bi b i − 1 b_{i-1} bi1之前不存在 b j ( j < i − 1 ) b_j(j<i-1) bj(j<i1),也就是 b i b_i bi必须紧邻着 b i − 1 b_{i-1} bi1

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
const int inf = 2e9+10;
int b[maxn],n; 
set<int>s;
int main()
{
	int t; cin >> t; 
	while( t-- )
	{	
		cin >> n;
		for(int i=1;i<=n;i++)	scanf("%d",&b[i] );
		s.insert(-inf); s.insert(inf); s.insert(b[1]);
		auto it = s.begin(); it++;
		int flag = 0;
		for(int i=2;i<=n;i++)
		{
			if( b[i]>*next(it) )	flag = 1;
			if( b[i]<*prev(it) )	flag = 1;
			s.insert( b[i] ); it = s.find( b[i] );
		}
		if( flag )	cout << "NO\\n";
		else	cout << "YES\\n";	
		s.clear();
	}
} 

以上是关于Codeforces Round #724 (Div. 2) D .Omkar and Medians(中位数,构造)的主要内容,如果未能解决你的问题,请参考以下文章

E. Omkar and Forest——Codeforces Round #724 (Div. 2)

E. Omkar and Forest——Codeforces Round #724 (Div. 2)

F. Omkar and Akmar游戏,组合,逆元—— Codeforces Round #724 (Div. 2)

Codeforces Round #724 (Div. 2)(CD)

Codeforces Round #724 div.2 A-F题解

Codeforces Round #724 div.2 A-F题解