(C++) 백준 2696 중앙값 구하기

mnaz·2021년 12월 15일

https://www.acmicpc.net/problem/2696

밥좀먹고해야쥐

#include <iostream>
#include <queue> 
using namespace std;

int arr[10005];
priority_queue<int, vector<int>, greater<int> > leftq; // bigger than mid
priority_queue<int> rightq; // smaller than mid
int mid=0;
queue<int> ans;
int T,M;


void solve(int x){

    if(x==M) {
        cout<<ans.size()<<'\n';
        int cnt=10;

        while(!ans.empty()){
            cout<<ans.front()<<" ";
            ans.pop();
            cnt--;
            if(cnt==0) {
                cnt=10;
                cout<<'\n';
            }
        }

        return ;
    }


    if(x==0) mid=arr[x];
    else {

        if (arr[x] > mid) leftq.push(arr[x]);
        else rightq.push(arr[x]);

        int queue_size = leftq.size()-rightq.size();

        if(queue_size>=2){
            while(leftq.size()>rightq.size()){
                rightq.push(mid);
                mid = leftq.top();
                leftq.pop();
            }
        }

        if(queue_size<=-2) {
            while (leftq.size() < rightq.size()) {
                leftq.push(mid);
                mid = rightq.top();
                rightq.pop();
            }
        }
    }

    if(x%2==0) ans.push(mid);

    solve(x+1);
}


int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);



    cin>>T;
    while(T--){

        cin>>M;
        for(int i=0; i<M; i++) cin>>arr[i];

        leftq = priority_queue<int, vector<int>, greater<int> >();
        rightq = priority_queue<int>();
        ans = queue<int>() ;
        mid=0;
        solve(0);
        cout<<'\n';
    }



}

0개의 댓글