思路:
值域树状数组 + 二分查找
将数据离散化,用树状数组维护每个数的个数,
再用二分查找寻找当前的中位数
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int Mn(100050); inline int lb(const int& x) { return x&(-x); } int a[Mn],b[Mn],p[Mn],c[Mn]; bool _cmp(const int& x,const int& y) { return a[x]==a[y] ? x<y : a[x]<a[y]; } int qry(int p) { int ret(0); for(;p;p-=lb(p)) ret += c[p]; return ret; } int main() { int n; scanf("%d",&n); for(int i(1);i<=n;++i) { scanf("%d",a+i); b[i] = i; } sort(b+1,b+n+1,_cmp); for(int i(1);i<=n;++i) p[b[i]] = i; for(int i(1);i<=n;++i) { for(int j(p[i]);j<=n;j+=lb(j)) ++c[j]; if(i%2) { int tar((i+1)/2); int l(1),r(n); while(r-l>3) { int mid((l+r)>>1); if(qry(mid)<tar) l = mid+1; else r = mid; } int pos(l); for(;pos<=r;++pos) if(qry(pos)==tar) break; cout << a[b[pos]] << endl; } } return 0; }
|