- 题目要求:现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。
代码如下:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int n;//操作数
int tree[100005];//树状数组,存储的是某一个数在栈中的个数
stack<int> s;
int lowbit(int x){
return x&(-x);
}
int getsum(int x){
int ans=0;
for(int i=x;i>0;i-=lowbit(i)){
ans+=tree[i];
}
return ans;
}
void add(int x,int y){//单点更新
for(int i=x;i<100005;i+=lowbit(i)){
tree[i]+=y;
}
}
void search_mid(){//二分寻找中位数
int left=1,right=100005,mid,k=(s.size()+1)/2;
while(left<=right) {
mid=(left+right)/2;
if(getsum(mid)>=k){
right=mid-1;
}else{
left=mid+1;
}
}
cout<<left<<endl;
}
int main() {
cin>>n;
string str;
int temp;
for(int i=0;i<n;i++){
cin>>str;
if(str=="Push") {
cin>>temp;
s.push(temp);
add(temp, 1);
}else if(str=="Pop") {
if(!s.empty()){
add(s.top(),-1);
cout<<s.top()<<endl;
s.pop();
}else{
cout<<"Invalid\n";
}
}else{
if(!s.empty()){
search_mid();
}else{
cout<<"Invalid\n";
}
}
}
return 0;
}