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

例题链接:https://vjudge.net/contest/236677#problem/D

题意:首先输入两个数字n,m。n表示有n张桌子,编号从1到n,m表示有m个操作,  然后接下来一行有n个数字,每个数字表示第i张桌子有ni张凳子,  接下来的m个操作里,每个操作有一个字符串str,加一个数字ch,  如果str==in,表示有ch个人的小队要坐下来,然后要我们找到凳子大于等于ch的ni值最小的然后编号最小的桌子(首先保证求所有大于等于ch里ni最小的数字,如果最小的ni有多个,取编号最小的),然后输出桌子编号,如果没有这样的桌子输出-1。当str==out时,表示做在编号为ch的桌子上的小队离开了,又可以坐人了。

这里看了其他的博客说要用set<pair<int,int> >(注意两个> >中间要加空格隔开),因为set会自动升序排列,然而这里每一个元素都是pair,它排列是先排pair里的first,再排second。比如说pair<2,3> pair<2,1> pair<0,6>排列之后是pair<0,6>,pair<2,1>,pair<2,3>。

介绍完排列规则,再自己看一下代码,理解一下就可以了。

#include<iostream>
#include<cstring>
#include<set>
using namespace std;
set<pair<int,int> >ss;
set<pair<int,int> >::iterator it;
int n,m,ch,num[100005];
char str[10];
int main()
{
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>num[i];
            ss.insert(make_pair(num[i],i));//插入 
        }
        for(int i=1;i<=m;i++)
        {
            cin>>str>>ch;
            if(str[0]=='i')
            {
                it=ss.lower_bound(make_pair(ch,0));//找最小的 
                if(it==ss.end())
                cout<<-1<<endl;
                else
                {
                    cout<<it->second<<endl;
                    ss.erase(it);//删除 
                }
            }
            else if(str[0]=='o')
            {
                ss.insert(make_pair(num[ch],ch));
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/6262369sss/p/9272107.html