For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.
Input
The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set contains the data set number, followed by a space, followed by an odd decimal integer M, (1 ≤ M ≤ 9999), giving the total number of signed integers to be processed.
The remaining line(s) in the dataset consists of the values, 10 per line, separated by a single space.
The last line in the dataset may contain less than 10 values.
Output
For each data set the first line of output contains the data set number, a single space and the number of medians output (which should be one-half the number of input values plus one). The output medians will be on the following lines, 10 per line separated by a single space. The last line may have less than 10 elements, but at least 1 element. There should be no blank lines in the output.
Sample Input
3 1 9 1 2 3 4 5 6 7 8 9 2 9 9 8 7 6 5 4 3 2 1 3 23 23 41 13 22 -3 24 -31 -11 -8 -7 3 5 103 211 -311 -45 -67 -73 -81 -99 -33 24 56
Sample Output
1 5 1 2 3 4 5 2 5 9 8 7 6 5 3 12 23 23 22 22 13 3 5 5 3 -3 -7 -3
题意:给n个数,给出第 i (i是奇数)个数时序列的中位数
每给出一个数都要记中位数,所以可以想到要把大于当前中位数的数和小的分开,并且保持一个升序或者降序最好
可以想到用两个优先队列来存数,一个可以看作降序存,一个看作升序存,每次为奇数时维护,可以看出其中一个队顶就保持着时中位数
我是先存在u(升序)中 当升序多2的时候 把一个移到降序中;当降序多1的时候,把一个移到升序中,保证升序顶为中位数
#include<bits/stdc++.h>
using namespace std;
#define mod 100000
#define inf 0x3f3f3f
#define maxn 10005
#define ll long long
priority_queue<int,vector<int>,greater <int> >u;
priority_queue<int,vector<int>,less <int> >d;
int an[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int nu=0;
int a,n;
scanf("%d %d",&a,&n);
int b;
scanf("%d",&b);
an[nu++]=b;
int mid=b;
u.push(mid);
for(int i=1; i<n; i++)
{
scanf("%d",&b);
if(i%2)
{
if(b>mid){
u.push(b);
}
else
{
d.push(b);
}
}
else
{
if(b>mid)
{
u.push(b);
int x=d.size();
int y=u.size();
if(y-x>=2)
{
int mo=u.top();
u.pop();
d.push(mo);
mid=u.top();
an[nu++]=mid;
}
else
{
an[nu++]=mid;
}
}
else
{
d.push(b);
int x=d.size();
int y=u.size();
if(x-y >= 1)
{
int mo=d.top();
d.pop();
u.push(mo);
mid=mo;
an[nu++]=mid;
}
else
an[nu++]=mid;
}
}
}
printf("%d %d\n",a,nu);
int i;
for(i=0;i<nu;i++)
{
printf("%d",an[i]);
if((i+1)%10==0||i==nu-1)
printf("\n");
else
printf(" ");
}
while(!u.empty())
u.pop();
while(!d.empty())
d.pop();
}
return 0;
}