码迷,mamicode.com
首页 > 其他好文 > 详细

【multiset】hdu 5349 MZL's simple problem

时间:2015-08-04 23:03:13      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:stl   multiset   

【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

版权声明:本文为博主原创文章,未经博主允许不得转载。

【multiset】hdu 5349 MZL's simple problem

标签:stl   multiset   

原文地址:http://blog.csdn.net/u012717411/article/details/47282871

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!