STL set<pair<int ,int> >用法

题目链接: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;
}

猜你喜欢

转载自www.cnblogs.com/xiongtao/p/9272543.html
int