输入格式:
第一行一个正整数N
第二行N个整数Ai
若Ai>0,则在把Ai扔到堆里
若Ai=0,则输出一行一个数,分别表示当前堆里的最大值。(保证堆非空)
若Ai<0,则把-Ai从堆里丢出去(保证堆中存在Ai)(若有多个只丢一个)
输出格式:
行数为Ai=0的个数,如输入描述。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
priority_queue<int>q;
int n;
multiset<int>s;
multiset<int>::iterator it;
int main()
{
scanf("%d",&n);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>0)
{
q.push(x);
continue;
}
else if(x<0)
{
s.insert(-x);
continue;
}
else if(x==0)
{
it=s.find(q.top());
if(it==s.end())
{
printf("%d\n",q.top());
continue;
}
else
{
do
{
s.erase(q.top());
q.pop();
it=s.find(q.top());
}
while(it!=s.end());
printf("%d\n",q.top());
}
}
}
}
%%%sys
虽然是堆排……但是显然set的可重集合更简单……