POJ 3784 Running Median 解题报告
题意:每当输入次数为奇数时,求当前数组中的中位数。
解题思路:建两个堆,大的放一个堆,小的放一个堆,每次输入都根据大小决定放哪个堆。
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
const int maxn = 1e9;
using namespace std;
priority_queue<int, vector<int>, greater<int> >q1;//头小尾大
priority_queue<int, vector<int>, less<int> >q2;//头大尾小
vector<int> g;
void Add(int temp)
{
if (q1.empty())
{
q1.push(temp);
return;
}
if (temp > q1.top())
q1.push(temp);
else
q2.push(temp);
while (q1.size() < q2.size())
{
q1.push(q2.top());
q2.pop();
}
while (q1.size() > q2.size() + 1)
{
q2.push(q1.top());
q1.pop();
}
}
int main()
{
int p,t,n,tem;
scanf("%d", &p);
while (p--)
{
while (!q1.empty())
q1.pop();
while (!q2.empty())
q2.pop();
g.clear();
scanf("%d%d", &t, &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &tem);
Add(tem);
if (i % 2 == 0)
g.push_back(q1.top());
}
printf("%d %d\n", t, (n + 1) / 2);
for (int i = 0; i < g.size(); i++)
{
if (i > 0 && i % 10 == 0)
printf("\n");
if (i % 10)
printf(" ");
printf("%d", g[i]);
}
printf("\n");
}
}