题意:酒吧里有两个服务员,每个人每次都只能服务一名客人,服务员2按照客人进酒吧的顺序服务,服务员3按照客人的钱来服务,询问\(q\),\(1\)表示有客人进入酒吧,带着\(m\)块钱,\(2\)表示询问服务员2当前应该服务的客人编号,\(3\)表示服务员3当前应该服务的客人编号.
题解:搞两个set,第一个set存pair,存编号和钱,用重载运算符来模拟排序,第二个set只存编号,然后模拟乱搞就行.
代码:
#include
#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
typedef pair
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
set
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;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章