题目链接:https://vjudge.net/contest/236677#problem/D
题意:有n张桌子,编号1到n,有q次询问。之后给出编号1到n的桌子的椅子数。询问有两种情况,in 进来num个人,如果能坐,选符合条件椅子数最小的,若有多组符合则选编号小的输出桌子编号。没有符合的条件则输出-1。out 则是出来num号桌子空出来。
用pair容器来储存桌子和相应椅子数,frist存椅子数,second存对应桌子,
pari的比较是按照字典序比较的,还有就是先比较first,frist的值大的时候,pair就大
如果first相等,再比较second,second大的就pair大。
再用set容器维护,因为set自带升序排序,所以用set方便,直接用库函数lower_bound()查找答案。
代码如下:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<set> #include<vector> using namespace std; set<pair<int,int> >s; set<pair<int,int> >::iterator it; int a[100050]; int main() { int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) { cin>>a[i]; s.insert(make_pair(a[i],i));//插入椅子数及其桌号 } char str[10]; int t; while(m--) { cin>>str>>t; if(str[0]=='i') { it=s.lower_bound(make_pair(t,0));//寻找答案 if(it==s.end())//没有符合条件 的 cout<<-1<<endl; else { cout<<it->second<<endl;//有,输出桌号 s.erase(it); } } else { s.insert(make_pair(a[t],t));//人走了,桌子可以坐,插入 进去 } } } return 0; }