解题思路
分别用大根堆和小根堆储存账单,弹出过的标记下来,然后在弹出队头时判断是否已被弹出。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
int n,m,cnt,a[1500010],v[1500010];
pair<int,int>v1,v2;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
priority_queue<pair<int,int> >q2;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
for(int j=cnt+1;j<=cnt+m;j++)
{
scanf("%d",&a[j]);
q1.push(make_pair(a[j],j));
q2.push(make_pair(a[j],j));
}
while(v[q1.top().second])
q1.pop();
v1=q1.top();
printf("%d ",v1.first);
v[v1.second]=1;
while(v[q2.top().second])
q2.pop();
v2=q2.top();
printf("%d\n",v2.first);
v[v2.second]=1;
cnt+=m;
}
}