对顶堆
用一个最大堆和一个最小堆,如果当前元素比最小堆堆顶的值大就插入最小堆,反之插入最大堆。维护最大堆和最小堆的元素差不超过一,如果超过,哪个堆的元素多就把这个堆的堆顶元素给另外一个堆
#include <iostream>
#include <queue>
using namespace std;
int t, num1, num2, x;
int read() {
char ch;
int sum, sign = 1;
while ((ch = getchar()) > '9' || ch < '0')
if (ch == '-')
sign = -1;
sum = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9')
sum = (sum << 3) + (sum << 1) + ch - '0';
return sum * sign;
}
int main()
{
t=read();
while (t--) {
num1=read();
num2=read();
cout << num1 << " " << (num2 + 1) / 2 << endl;
priority_queue<int,vector<int> ,greater<int> >q1;
priority_queue<int, vector<int>, less<int> >q2;
x=read();
cout << x << " ";
q1.push(x);
for (int i = 2; i <= num2; i++) {
x=read();
if (q1.top() >= x) {
q2.push(x);
}
else {
q1.push(x);
}
if (q1.size() > 1+q2.size()) {//注意不能写为q1.size()-q2.size()>1 这样写vector会越界(不知道原因emm
q2.push(q1.top());
q1.pop();
}
else if (q2.size() > 1+q1.size()) {//这个也要注意
q1.push(q2.top());
q2.pop();
}
if (i % 2 == 1) {
if (q1.size() > q2.size())cout << q1.top() << " ";
else cout << q2.top() << " ";
}
if (i % 20 == 0) {
cout << endl;
}
}
cout << endl;
}
}


京公网安备 11010502036488号