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;
}