【set】poj 3481 Double Queue

  首先呢,这是一道set裸题。

  其实介绍这道题最大的目的其实是为了熟悉set的用法。只要学会set的基础用法,这道题自然迎刃而解了啊。(超菜的啊


 set基础操作

  • 作为队列的一种,自然有插入q.insert(x) ->x是插入元素,q是队列名称。还有删除操作 q.erase(x);

                    --当然这题就会这些就够了啊。毕竟这是一道真·水题

  • begin() 返回指向第一个元素的迭代器
  • clear() 清除所有元素
  • count() 返回某个值元素的个数
  • empty() 如果集合为空,返回true(真)
  • end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
  • find() 返回一个指向被查找到元素的迭代器
  • max_size() 返回集合能容纳的元素的最大限值
  • size() 集合中元素的数目
  • swap() 交换两个集合变量

 -->set这种队列,是一种自带排序的队列。所以在使用结构体作为插入元素时,一定要重载运算符。还有,set中是没有重复元素的。一定要注意啊。


最后代码一波带走本题AC

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
struct ss{
    int k,p;
    bool operator < (const ss &a) const{
        if(p==a.p) return k<a.k;
        return p<a.p;
    }
}a;
set<ss>sl;
int main()
{
    //freopen("1.txt","r",stdin);
    int n;
    while(scanf("%d",&n)==1) {
        if(n==1) {
            scanf("%d%d",&a.k,&a.p);
            sl.insert(a);
        }
        if(n==3) {
            if(sl.empty()) printf("0\n");
            else {
                a=*(sl.begin());
                printf("%d\n",a.k);
                sl.erase(a); 
            }
        }
        if(n==2) {
            if(sl.empty()) printf("0\n");
            else {
                a=*(--sl.end());
                printf("%d\n",a.k);
                sl.erase(a);
            }
        }
        if(n==0) return 0;
    }
    return 0; 
}

双手奉上数据。

Input

2
1 20 14
1 30 3
2
1 10 99
3
2
2
0

Output

0
20
30
10
0

 本题结束。


 

但是,set可不止这样-->  set还支持集合中的并集,交集,差集和补集    -->(划重点!

  1. 并集:
  2. std::set_union() 

    交集:

    std::set_intersection()
  3. 差集:
    std::set_difference()
  4. 补集(这是个玄学,反正我理解不了怎么实现的):
    std::set_symmetric_difference():这个是第一个迭代器于第二个的差集 然后再 并上第二个相对于第一个的差集 

还有什么的话,想到再补充啦。(当然如果你是高端人士的话有基础,可以自行参考这篇博客:stl-set   我是从这里学的....QAQ)

那么就这样啦。谢谢。

 

posted @ 2019-02-26 13:40  鸽子咕  阅读(205)  评论(0编辑  收藏  举报