Codeforces Round #724 (Div. 2) D .Omkar and Medians(中位数,构造)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #724 (Div. 2) D .Omkar and Medians(中位数,构造)相关的知识,希望对你有一定的参考价值。
考虑增量构造
因为 b i − 1 b_{i-1} bi−1是 a 1 , a 2 . . . a i − 1 . . . a 2 i − 3 a_1,a_2...a_{i-1}...a_{2i-3} a1,a2...ai−1...a2i−3的中位数
令 c c c数组为 a a a排序后的数组
那么 c i − 1 = b i − 1 c_{i-1}=b_{i-1} ci−1=bi−1
考虑现在在数组中增加两个数字,使得 b i b_{i} bi成为新的中位数
若添加的两个数都比 c i − 1 c_{i-1} ci−1大,那么中位数往右边移动一位,若都比 c i − 1 c_{i-1} ci−1小,那么中位数往左边移动一位
若一大一小,中位数仍然是 c i − 1 c_{i-1} ci−1
这样我们可以得到, b i < c i − 2 b_{i}<c_{i-2} bi<ci−2或 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∈[ci−2,ci]
这就意味着 b i b_i bi到 b i − 1 b_{i-1} bi−1之前不存在 b j ( j < i − 1 ) b_j(j<i-1) bj(j<i−1),也就是 b i b_i bi必须紧邻着 b i − 1 b_{i-1} bi−1
#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)