b_pat_栈(2*multiset+stack)

现在,你需要实现一个栈,该栈要具有一个额外的操作:PeekMedian-返回栈中所有元素的中值。
对于 N 个元素,如果 N 为偶数,则中值定义从小到大第 N/2 个元素;如果 N 为奇数,则中值定义为从小到大第 (N+1)/2 个元素(N≤1e5)

方法一:2*multiset+stack模拟

用minS存≤mid的数,maxS存>mid的数,分为两个情况:

#include<bits/stdc++.h>
using namespace std;
multiset<int> minS, maxS;   //minS存小于等于mid的数;maxS存大于mid的数
int mid;
void update() {
    if (minS.size()>maxS.size()+1) {
        auto it=minS.end();
        minS.erase(--it), maxS.insert(*it);
    }if (minS.size()<maxS.size()) {
        auto it=maxS.begin();
        minS.insert(*it), maxS.erase(it);
    }if (!minS.empty()) {
        auto it=minS.end(); 
        mid=*(--it);
    }
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n; cin>>n;
    string a,b;
    stack<int> st;
  
    for (int i=0; i<n; i++) {
        cin>>a;
        if (a=="Push") {
            cin>>b;
            int v=stoi(b); st.push(v);
            if (v<=mid) minS.insert(v);
            else        maxS.insert(v);
            update();
        } else if (a=="Pop") {
            if (st.empty()) printf("Invalid\n");
            else {
                int v=st.top(); st.pop();
                if (v<=mid) minS.erase(minS.find(v));
                else        maxS.erase(maxS.find(v));
                update();
                printf("%d\n", v);
            }
        } else {
            if (st.empty()) printf("Invalid\n");
            else printf("%d\n", mid);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wdt1/p/13657813.html