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