知识点应用

#include<cstdio>
#include<queue>
#include<functional>
using namespace std;

priority_queue<int> q1; //大根堆Q1:维护集合中较小值的部分的最大值。


priority_queue<int, vector<int>, greater<int> > q2; //小根堆Q2:维护集合中较大值的部分的最小值。

void insert(int x)
{
	if (!q2.size() || x > q2.top()) 
		q2.push(x);
	else 
		q1.push(x);
	if (q1.size() > q2.size() + 1) { //保证两个堆元素数量相差不超过一
		q2.push(q1.top()); 
		q1.pop(); 
	}
	if (q2.size() > q1.size() + 1) { 
		q1.push(q2.top()); 
		q2.pop(); 
	}
}

int main()
{
	int T, n, id, mid;
	scanf("%d", &T);

	while (T--)
	{
		while (q1.size()) 
			q1.pop();
		while (q2.size()) 
			q2.pop();
		scanf("%d%d", &id, &n);
		printf("%d %d\n", id, (n + 1) / 2);

		int cnt = 0;
		for (int i = 1; i <= n;i++)
		{
			int x; scanf("%d", &x);
			insert(x);
			if (i & 1)
			{
				printf("%d ", q1.size() > q2.size() ? q1.top() : q2.top());//奇数的时候多出来的就是中位数
				if (++cnt == 10 && i != n) { 
					puts(""); 
					cnt -= 10; 
				} //输出格式要注意 
			}
		}
		puts("");
	}
	return 0;
}