题意:
解法:
2*1-1=1,因此b[1]=b[1].
2*2-1=3,因此b[1]=mid(a[1],a[2],a[3]),
发现每次都是加入两个数,
那么中位数的变化情况只有3种可能:
1.变小一次
2.变大一次
3.不变
对于b[i],上一个中位数为b[i-1],如果满足条件,则b[i-1]与b[i]之间应该没有其他的数,
用BIT存b[1,i]的所有数,每种数只存一次,查询x=ask(b[i-1]),y=ask(b[i]),
如果abs(x-y)>1则无解.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
struct BIT{
int c[maxm];
int lowbit(int i){
return i&-i;
}
void add(int i,int t){
while(i<maxm){
c[i]+=t;i+=lowbit(i);
}
}
int ask(int i){
int ans=0;
while(i){
ans+=c[i];i-=lowbit(i);
}
return ans;
}
}T;
int a[maxm];
int xx[maxm],num;
int n;
void solve(){
cin>>n;
num=0;
for(int i=1;i<=n;i++){
cin>>a[i];
xx[++num]=a[i];
}
sort(xx+1,xx+1+num);
num=unique(xx+1,xx+1+num)-xx-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(xx+1,xx+1+num,a[i])-xx;
}
map<int,int>mp;
T.add(a[1],1);
mp[a[1]]=1;
for(int i=2;i<=n;i++){
if(!mp[a[i]]){
T.add(a[i],1);
mp[a[i]]=1;
}
int x=T.ask(a[i]);
int y=T.ask(a[i-1]);
if(abs(x-y)>1){
cout<<"NO"<<endl;
for(auto i:mp){
T.add(i.first,-1);
}
return ;
}
}
cout<<"YES"<<endl;
for(auto i:mp){
T.add(i.first,-1);
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;cin>>T;while(T--)
solve();
return 0;
}