0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1057 Stack(30 分)


题目链接:​​点击打开链接​​


题目大意:略。

解题思路:multiset 技巧分为两个set,一个从小到大,一个从大到小,来控制平衡求第几大K数。

PAT (Advanced Level) Practice - 1057 Stack(30 分)_第几大K数

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

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


举报

相关推荐

0 条评论