【multiset】hdu 5349 MZL's simple problem

【multiset】hdu 5349 MZL’s simple problem

题目链接:hdu 5349 MZL’s simple problem

题目大意

n次操作,插入元素、删除最小元素、查询最大元素并输出。

这里写图片描述
这里写图片描述

C++STL的multiset的使用


set——多元集合(元素不可重复),multiset——可重复元素的多元集合
多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象。(具体用法请参照set容器)
set和multiset内部是以平衡二叉树实现的:
这里写图片描述
从内部数据结构可以看出,它的中序遍历是一个有序序列,第一个元素为最小值,最后一个元素是最大值,而且所有STL操作复杂度都是O(logN)

操作函数列表:

begin()返回指向第一个元素的迭代器
clear()清除所有元素
count()返回指向某个值元素的个数
empty()如果集合为空,返回true
end()返回指向最后一个元素的迭代器
equal_range()返回集合中与给定值相等的上下限的两个迭代器
erase()删除集合中的元素
find()返回一个指向被查找到元素的迭代器
get_allocator()返回多元集合的分配器
insert()在集合中插入元素
key_comp()返回一个用于元素间值比较的函数
lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器
max_size() 返回集合能容纳的元素的最大限值
rbegin()返回指向多元集合中最后一个元素的反向迭代器
rend()返回指向多元集合中第一个元素的反向迭代器
size()多元集合中元素的数目
swap()交换两个多元集合变量
upper_bound()返回一个大于某个值元素的迭代器
value_comp()返回一个用于比较元素间的值的函数

说一下反向迭代器

反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 – 运算则访问下一个元素。

//反向迭代器的声明
multiset<int>::reverse_iterator It;
//区别一般迭代器
multiset<int>::iterator it;

【图解】以vector容器的v.begin()、v.end()与v.rbegin() 、v.rend()为例,看一下他们指向的位置就很清楚了!
这里写图片描述


说一下思路

熟练multiset的insert(),erase(),rbegin()的使用即可,注意rbegin()返回的是一个反向迭代器,要提前声明好;erase(iterator) 传入的参数是一个迭代器;

这里写图片描述

参考代码

/*====================================*\
|*         STL  之   multiset         *|
\*====================================*/
/*Author:Hacker_vision*/
#include<bits/stdc++.h>
#define clr(k,v) memset(k,v,sizeof(k))
using namespace  std;

const int _max = 2e4 + 10;
int n,x,op;//op操作数;
multiset<int>ms;
multiset<int>::iterator it;
multiset<int>::reverse_iterator It;

int main(){
  #ifndef ONLINE_JUDGE
  freopen("input.txt","r",stdin);
  #endif // ONLINE_JUDGE
  while(scanf("%d",&n)==1){
    ms.clear();
    for(int i = 0; i < n; ++ i){
        scanf("%d",&op);
        if(op==1){
            scanf("%d",&x);
            ms.insert(x);
        }
        else if(op==2){
            it = ms.begin();//it指向multiset中最小元素(第一个)
            if(ms.size()) ms.erase(it);//.erase(itetator it)参数数迭代器
        }
        else{
            It = ms.rbegin();//it指向multiset中最大元素(最后一个)
            if(ms.size()) printf("%d\n",*It);
            else puts("0");
        }
    }
  }
  return 0;
}
  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值