一.题目链接:
POJ-3784
二.题目大意:
给你 n 个数,当 i 为奇数时,输出中位数.
三.分析:
对顶堆维护即可.
另外不要 PE.
对顶堆学习
四.代码实现:
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long int
using namespace std;
const int M = (int)1e6;
const ll mod = (ll)1e9 + 7;
const int inf = 0x3f3f3f3f;
priority_queue <int, vector<int>, less<int> > big;
priority_queue <int, vector<int>, greater<int> > small;
void init()
{
while(!small.empty())
small.pop();
while(!big.empty())
big.pop();
}
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ++ca)
{
init();
int n;
scanf("%*d %d", &n);
printf("%d %d\n", ca, n / 2 + 1);
int x;
for(int i = 0; i < n; ++i)
{
scanf("%d", &x);
if(i && !(i & 1))
{
if(i % 20 == 0)
printf("\n");
else
printf(" ");
}
if(small.empty() || x > small.top())
small.push(x);
else
big.push(x);
if(small.size() > big.size() + 1)
{
big.push(small.top());
small.pop();
}
if(big.size() >= small.size() + 1)
{
small.push(big.top());
big.pop();
}
if(!(i & 1))
printf("%d", small.top());
}
printf("\n");
}
return 0;
}