D - Omkar and Medians(数据结构+思维)
Posted zjj0624
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - Omkar and Medians(数据结构+思维)相关的知识,希望对你有一定的参考价值。
题意
给你一个数组b,问是否有一个数组a,使每一个
b
i
b_i
bi,都是在
a
1
,
a
2
,
a
3
,
.
.
.
.
.
.
a
2
∗
i
−
1
a_1,a_2,a_3,......a_{2*i-1}
a1,a2,a3,......a2∗i−1的中位数。
思路
我们知道
b
1
,
b
2
b_1,b_2
b1,b2很容易就可以用a构造出来,但是在
b
3
b_3
b3的时候,就不一定了,只有
b
3
b_3
b3在上一个中位数的小于第一个中位数的值到中位数,和上一个中位数到第一个大于中位数的区间内时,
b
3
b_3
b3才可能是这一轮的中位数,如果满足,就更新当前的区间就可以了,如果没有大于中位数的数,就让右区间设位INF,左区间同理。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 2e5+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1 ; i<=n ; i++) cin>>a[i];
int mid=a[1];
int l=-INF,r=INF;
bool flag=true;
set<int>s;
s.insert(INF);
s.insert(-INF);
s.insert(a[1]);
for(int i=2 ; i<=n ; i++)
{
if(a[i]==mid) continue;
// cout<<l<<" "<<mid<<" "<<r<<endl;
//cout<<i<<" "<<a[i]<<" "<<r<<endl;
s.insert(a[i]);
if(a[i]>=l&&a[i]<mid)
{
if(a[i]==l)
{
auto x=s.find(a[i]);
r=mid;
x--;
l=*x;
mid=a[i];
}
else
{
r=mid;
mid=a[i];
}
}
else if(a[i]>mid&&a[i]<=r)
{
if(a[i]==r)
{
auto x=s.find(a[i]);
x++;
l=mid;
//cout<<*x<<endl;
r=*x;
mid=a[i];
}
else
{
l=mid;
mid=a[i];
}
}
else flag=false;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
以上是关于D - Omkar and Medians(数据结构+思维)的主要内容,如果未能解决你的问题,请参考以下文章
D. Omkar and Medians——Codeforces Round #724 (Div. 2)
D. Omkar and Medians——Codeforces Round #724 (Div. 2)
CodeforcesRound#749(Div.1.2basedonTechnocup2022EliminationRound1)-D.Omkar and the Meaning of Life-题解