legolas7 @ 2024-02-09 15:39:27
rt,线段树+离散化+二分,求调悬关
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 100005
#define le p<<1
#define ri (p<<1)|1
typedef long long ll;
using namespace std;
int n;
int arr[N],b[N],maxf,midd;
struct edge{
int lf,rt,num;
}t[N<<2];
void up(int p){
t[p].num=t[le].num+t[ri].num;
}
void build(int p,int l,int r){
t[p].lf=l,t[p].rt=r,t[p].num=0;
if(l==r) return;
int mid=(l+r)>>1;
build(le,l,mid);
build(ri,mid+1,r);
up(p);
}
void add(int p,int lf,int rt,int l,int k){
if(lf==rt){
t[p].num+=k;
return;
}
int mid=(lf+rt)>>1;
if(l<=mid) add(le,lf,mid,l,k);
else add(ri,mid+1,rt,l,k);
up(p);
}
int findf(int p,int lf,int rt,int len){
if(lf==rt) return t[p].lf;
int mid=(lf+rt)>>1;
if(t[le].num>=len){
return findf(le,lf,mid,len);
}
else{
return findf(ri,mid+1,rt,len-t[le].num);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i],b[i]=arr[i];
sort(b+1,b+n+1);
int k=unique(b+1,b+n+1)-b;
build(1,1,n);
maxf=-0x3f3f3f3f;
for(int i=1;i<=n;i++){
arr[i]=lower_bound(b+1,b+k+1,arr[i])-b;
add(1,1,n,arr[i],1);
if(i%2==1){
int f=findf(1,1,k,i/2+1);
cout<<b[f]<<'\n';
}
}
return 0;
}