【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

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

【multiset】hdu 5349 MZL's simple problem

时间: 2024-08-03 15:20:52

【multiset】hdu 5349 MZL's simple problem的相关文章

hdu 5349 MZL&#39;s simple problem(multiset)

代码: #include<set> #include<cstdio> using namespace std; multiset<int> st; int main() { int n; multiset<int>::iterator it; while(scanf("%d",&n)==1) { st.clear(); int k,num; for(int i=0; i<n; i++) { scanf("%d&qu

hdu 5349 MZL&#39;s simple problem

Problem Description A simple problem Problem Description You have a multiple set,and now there are three kinds of operations: 1 x : add number x to set 2 : delete the minimum number (if the set is empty now,then ignore it) 3 : query the maximum numbe

hdu - 5349 MZL&#39;s simple problem(解题报告)

A - MZL's simple problem Time Limit:1500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A simple problem Problem Description You have a multiple set,and now there are three kinds of operations: 1 x : add number

HDU 5349 MZL&#39;s simple problem(优先队列)

MZL's simple problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 776    Accepted Submission(s): 375 Problem Description A simple problem Problem Description You have a multiple set,and now

【搜索】HDU 5348 MZL&#39;s endless loop

通道 题意:给出n个点,m条边,现在要给边定向使得点的出度和入度的差不超过1 思路: 对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止,每条边只遍历一次 代码: #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #inclu

hdoj 5349 MZL&#39;s simple problem

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5349 1 #include<stdio.h> 2 int main(){ 3 int cnt; 4 int max; 5 int N; 6 int ch; 7 while(~scanf("%d",&N)){ 8 cnt = 0; 9 while(N--){ 10 scanf("%d",&ch); 11 if(ch==1){ 12 scanf(

mutiset HDOJ 5349 MZL&#39;s simple problem

题目传送门 1 /* 2 这题可以用stl的mutiset容器方便求解,我对这东西不熟悉,TLE了几次,最后用读入外挂水过. 3 题解有O(n)的做法,还以为我是侥幸过的,后来才知道iterator it写在循环内才超时了,囧! 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 12:10:11 8 File Name :G.cpp 9

【搜索】 HDU 5323 Solve this interesting problem

点击打开链接 用线段树方式建树 [ 0, n] 已知[ l, r] 结点 求n 若 建一个[0, 2*r] 的线段树  这是的总点数的奇的,(左子树!=右子树 [0, r]  在左子树里 则n最大为2*r 若 建一个[0, 2*r+1] 的线段树 (左子树==右子树 [0, r]  在左子树里 这时则 [0, r] 就可以建树 所以搜的时候超出2*r 就直接return #include <cstdio> #include <cstring> #include <cstdli

【后缀自动机】HDU 5343 MZL&#39;s Circle Zhou

通道 题意:从A,B分别取出子串X,Y,求多少种不同的X+Y 思路: 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_N = 200007; typedef unsigned long long ll; struct SAM { int val[MAX_N], fa[MAX_N], c[26][MAX_N]; int tot,