题目链接:点击打开链接
题目大意:略。
解题思路:multiset 技巧分为两个set,一个从小到大,一个从大到小,来控制平衡求第几大K数。
AC 代码
using namespace std;
typedef long long ll;
stack<int> sk;
multiset<int> stmax; // 0->1
multiset<int,greater<int>> stmin; // 1->0
int mid;
void keep()
{
int len1=stmin.size(), len2=stmax.size();
if(len1<len2) // 1 2
{
stmin.insert(*stmax.begin());
stmax.erase(stmax.begin());
}
else if(len1-len2>=2) // 2 2,5 3
{
stmax.insert(*stmin.begin());
stmin.erase(stmin.begin());
}
mid=*stmin.begin();
}
int main()
{
int n,val,id;
char op[15];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",op);
if(op[1]=='u')
{
scanf("%d",&val);
sk.push(val);
if(val<=mid) stmin.insert(val);
else stmax.insert(val);
keep();
}
else if(op[1]=='o')
{
if(sk.size()==0) puts("Invalid");
else
{
int tp=sk.top(); sk.pop();
printf("%d\n",tp);
if(tp>*stmin.begin()) stmax.erase(stmax.find(tp));
else stmin.erase(stmin.find(tp));
if(sk.size()!=0) keep();
}
}
else if(op[1]=='e')
{
if(sk.size()==0) puts("Invalid");
else printf("%d\n",mid);
}
}
return 0;
}