#4WA 80pts求助

P1168 中位数

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;
}

|