Running Median Again
Given below code is for rmid2 spoj or Running Median Again spoj.
Hint:- Think of MinHeap and MaxHeap to maintain median.
/*
===================================================
Name :- Nishant Raj
Email :- raj.nishant360@gmail.com
College :- Indian School of Mines
Branch :- Computer Science and Engineering
Time :- 14 September 2015 (Monday) 19:32
===================================================*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair < int , int >
#define pb push_back
#define mp make_pair
#define mod 1000000009
#define pql priority_queue<int , vector<int> , less<int> >
#define pqg priority_queue<int , vector<int> , greater<int> >
int get_median(int stream , int med , pql &left , pqg &right){
int median = med;
int balance = left.size() - right.size();
if(stream == -1){
if(!left.empty() && !right.empty() && median == left.top() && median == right.top()){
if(left.size() < right.size())
right.pop();
else
left.pop();
}
else if(!left.empty() && median == left.top())
left.pop();
else if(!right.empty() && median == right.top())
right.pop();
if((left.size() ==0) && (right.size() == 0)){
return 0;
} else if(left.size() == right.size()){
return left.top();
} else if(left.size() < right.size()){
return right.top();
} else if(left.size() > right.size()){
return left.top();
}
}
if(balance == 0){
if(stream < median){
left.push(stream);
median = left.top();
} else{
right.push(stream);
median = right.top();
}
} else if(balance > 0){
if(stream < median){
right.push(left.top());
left.pop();
left.push(stream);
} else{
right.push(stream);
}
median = min(left.top() , right.top());
} else if(balance < 0){
if(stream < median){
left.push(stream);
} else{
left.push(right.top());
right.pop();
right.push(stream);
}
median = min(left.top() , right.top());
}
return median;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
pql left;
pqg right;
int n;
int median = 0;
while(true){
scanf("%d" , &n);
if(n == 0){
break;
}
if(n == -1)
printf("%d\n", median);
median = get_median(n , median , left , right);
}
}
return 0;
}
No comments:
Post a Comment
Your comment is valuable to us