- 题意:酒吧里有两个服务员,每个人每次都只能服务一名客人,服务员2按照客人进酒吧的顺序服务,服务员3按照客人的钱来服务,询问(q),(1)表示有客人进入酒吧,带着(m)块钱,(2)表示询问服务员2当前应该服务的客人编号,(3)表示服务员3当前应该服务的客人编号.
- 题解:搞两个set,第一个set存pair,存编号和钱,用重载运算符来模拟排序,第二个set只存编号,然后模拟乱搞就行.
- 代码:
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
#define rep(a,b,c) for(int a=b;a<=c;++a)
#define per(a,b,c) for(int a=b;a>=c;--a)
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
int q;
struct misaka{
bool operator () (const PII &a,const PII &b) const{
if(a.fi!=b.fi) return a.fi>b.fi;
return a.se<b.se;
}
};
set<PII,misaka> q1;
set<int> q2;
int cnt[N];
int op;
int x;
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>q;
int idx=0;
while(q--){
cin>>op;
if(op==1){
cin>>x;
cnt[++idx]=x;
q1.insert(make_pair(x,idx));
q2.insert(idx);
}
else if(op==2){
int cur=*q2.begin();
q2.erase(cur);
q1.erase(make_pair(cnt[cur],cur));
cout<<cur<<' ';
}
else{
auto tmp=*q1.begin();
int cur=tmp.se;
q1.erase(tmp);
q2.erase(cur);
cout<<cur<<' ';
}
}
return 0;
}