Running Median
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1323 Accepted Submission(s): 461
Problem Description
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
题意:
在每个奇数下标的位置输出从开始到这个位置的中位数,保证数组的长度一定是奇数
思路:
维护两个优先队列,一个大根堆一个小根堆,需要输出时调整两个堆的内容
输出格式是真的坑
行尾不能有空格,不能有空行,最后一行要输出一行空行 -。-
#include <bits/stdc++.h>
using namespace std;
int n;
priority_queue<int,vector<int>,less<int> >q1;
priority_queue<int,vector<int>,greater<int> >q2;
int main()
{
//freopen("1.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
int c;
scanf("%d%d",&c,&n);
printf("%d %d\n",c,(n+1)/2);
int cnt=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
int to=i/2+1;
if(!q1.empty()&&x<=q1.top())
q1.push(x);
else if(!q2.empty()&&x>=q2.top())
q2.push(x);
else if(q1.size()>=to)
q2.push(x);
else
q1.push(x);
if(i&1)
{
while(q1.size()<to)
{
int tp=q2.top();
q2.pop();
q1.push(tp);
}
while(q1.size()>to)
{
int tp=q1.top();
q1.pop();
q2.push(tp);
}
if(to%10!=1)
printf(" ");
printf("%d",q1.top());
cnt++;
if(cnt%10==0&&i!=n)
printf("\n");
}
}
printf("\n");
}
}