本来想用做的,重复的值保存其个数在对应的数组,但是逻辑还是太麻烦了;
最后用的是算法笔记中的代码。
#include<bits/stdc++.h>
using namespace std;
stack<int> s;
int block[317]={0},num[100001]={0};
void Median(int k)
{
int cn=0,cb=0;
while(cn+block[cb]<k)
{
cn+=block[cb++];
}
int change=cb*317;
while(cn+num[change]<k)
{
cn+=num[change++];
}
printf("%d\n",change);
}
int main()
{
int n,temp;
scanf("%d",&n);
char cmd[12];
while(n--)
{
scanf("%s",cmd);
if(strcmp(cmd,"Push")==0)
{
scanf("%d",&temp);
s.push(temp);
num[temp]++;
block[temp/317]++;
}
else if(strcmp(cmd,"Pop")==0)
{
if(s.empty()) printf("Invalid\n");
else{
temp=s.top();
printf("%d\n",temp);
s.pop();
num[temp]--;
block[temp/317]--;
}
}
else{
if(s.empty()) printf("Invalid\n");
else{
int k=s.size();
k=k/2+k%2;
Median(k);
}
}
}
return 0;
}