动态查询区间中位数
对顶堆,上面一个大根堆,下面小根堆,因此数值从上到下递增
不断交换堆顶的元素,使得abs(sz1-sz2)<=1
#include <iostream> #include <algorithm> #include <queue> #include <cmath> using namespace std ; const int N =1e5+5; priority_queue<int,vector<int> ,less<int> >q1; priority_queue<int,vector<int> ,greater<int> >q2; int n,a[N]; void solve(){ cin>>n; int i; for(i=1;i<=n;i++) cin>>a[i]; q1.push(a[1]); cout<<a[1]<<endl; for(i=2;i<=n;i++){ if(a[i]>q1.top()) q2.push(a[i]); else q1.push(a[i]); while(abs(int(q1.size()-q2.size()))>1) if(q1.size()>q2.size()) q2.push(q1.top()),q1.pop(); else q1.push(q2.top()),q2.pop(); if(i&1){ if(q1.size()>q2.size()) cout<<q1.top(); else cout<<q2.top(); cout<<endl; } } } signed main(){ solve(); }
标签:q1,q2,int,中位数,push,include,P1168,size From: https://www.cnblogs.com/towboa/p/17176479.html