洛谷P1168 中位数

 

#include <bits/stdc++.h>
using namespace std;
int n,t;
int b[100005],f[100005],w[100005];    //树状数组 
struct O{
    int x,i;
}a[100005];
 bool cmp(const O &a,const O &b){
    return a.x<b.x;
}
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;++i) scanf("%d",&a[i].x),a[i].i=i;
    sort(a+1,a+n+1,cmp);

    //离散化
    t=0;        //a[i].x : [0,1e9]
    a[0].x=-1;
    for (int i=1;i<=n;++i){
        if (a[i].x!=a[i-1].x) w[++t]=a[i].x;
        b[a[i].i]=t;
    }

    //b[i]   now : [1,n]
    for (int i=1;i<=n;++i){
        for (int j=b[i];j<=n;j+=j&-j) f[j]++;
        if (i&1){    // (i%2!=0)
            int l=1,r=n,mid,x;                // [l,r]
            while (l<r){
                mid=(l+r)/2;
                x=0;
                for (int j=mid;j;j-=j&-j) x+=f[j];
                if (x<=i/2) l=mid+1; else r=mid;
            }
            printf("%d\n",w[l]);
        }
    }
     return 0;
 }
树状数组+二分

相关文章: