STL多重集合multiset

导语:今天看IOI2004的论文集,学到了一种集合函数,顺便把它记录下来,一位很牛的学长关于此集合写的很详细,可以参考他的博客链接click here~~

例题:支付帐单:

题目描述

比尔最近遇到了一件麻烦事。每天上午,他会收到若干张帐单(也可能一张也没收到),每一张都有一定的面额。下午,他会从目前还没有支付的帐单中选出面额最大和最小的两张,并把它们付清。还没有支付的帐单会被保留到下一天。现在比尔已经知道他每天收到帐单的数量和面额,请你帮他给出支付的顺序。

约束条件 天数的上限为30,000,每天至少有两张可支付的帐单,保证最后一天全部付清

【输入格式

第1 行:一个正整数N(N≤30,000),表示总共的天数。

第2 行到第N+1 行:每一行描述一天中收到的帐单。先是一个非负整数M,表示当天

收到的账单数,后跟M 个正整数(都小于1,000,000,000),表示每张帐单的面额。

输入数据保证每天都可以支付两张帐单,并且帐单会在最后一天全部付清。

【输出格式

输出共N 行,每行两个用空格分隔的整数,分别表示当天支付的面额最小和最大的支

票的面额。

【输入】

4

3 3 6 5

2 8 2

3 7 1 7

0

【输出】

3 6

2 8

1 7

5 7

【思路分析】

从数据范围来看,帐单的接收和支付要在O(log n)或以下完成。

思路一:建一个最大堆和一个最小堆,并在相应元素之间建立映射。

思路二:建一棵平衡二叉树。用STL中的多重集合multiset来实现

/*

关联容器的multiset函数

*/

代码实现:

#include <bits/stdc++.h>
using namespace std;
#include <iterator>
#include <utility>
#include <memory>
#include <algorithm>
#include <functional>
#include <numeric>
int main()
{
    int n,m,p;
    multiset<int >bills;<span><span></span><span class="comment">//可重复的多元集合</span><span> </span></span>
    cin>>n;
    while(n--)
    {
        cin>>m;
        while(m--)
        {
            cin>>p;
            bills.insert(p);<span><span class="comment">//插入一次自动排序一次</span><span>  </span></span>
        }
        cout<<*bills.begin()<<" "<<*(--bills.end())<<endl;
        bills.erase(bills.begin());
        bills.erase(--bills.end());
    }
    return 0;
}

时间: 2024-08-03 21:50:58

STL多重集合multiset的相关文章

C++STL之multiset多重集合容器

multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明头文件包含"#include<set>", 由于它包含重复元素, 所以, 在插入元素, 删除元素, 查找元素上较set有差别. 1.1multiset元素的插入 下面这个程序插入了重复键值"123", 最后中序遍历了multiset对象. #include&

multiset多重集合容器

跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_range函数能够搜索出某一键值下的全部元素位置. 创建multiset对象 有下面几种方式. (1)    multiset() multiset<int> ms; (2)    multiset(constkey_compare&cmp) //student结构体 structstuden

第12章 multiset多重集合容器

/* 第12章 multiset多重集合容器 12.1 multiset技术原理 12.2 multiset应用基础 12.3 本章小结 */ // 第12章 multiset多重集合容器 // 12.1 multiset技术原理 ---------------------------------------------------------------------------- // 12.2 multiset应用基础 ------------------------------------

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

单词数 (STL set集合)

单词数 Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就是一篇小文章.每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束. Output 每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数. Sample Input you are my friend # Sample

2017.3.10组合数学学习——多重集合的排列

多重集合的排列定理:设S是多重集合,他有k种不同类型的对象,每一种类型的有限重复数是n1,n2,n3,…nk.设S的大小为n=n1+n2+n3+…nk.则S的n排列数目为n!/(n1!n2!n3!…nk!)证明:先从S中选出n1个位置放a1,有C(n,n1)种放法,再选出n2个位置放a2,有C(n-n1,n2)种放法……由乘法原理得:S的排列个数=C(n,n1)*C(n-n1,n2)*C(n-n1-n2,n3)*…*C(n-n1-n2-…-nk-1,nk)∵C(n,r)=p(n,r)/r!=n!

[转]容斥原理与多重集合{理论}

本文转自http://blog.csdn.net/ACdreamers/article/details/9923955 原博主:ACdreamers 首先介绍一个重要定理: 设S是有k种类型对象的多重集合,每种元素均具有无限的重复数.那么S的r组合的个数等于: 问题一:多重集合的组合问题 问题描述:给定3个a,4个b,5个c,现在要选10个元素,求一共有多少种组合? 分析:本问题就是相当于求S={3·a,4·b,5·c}的10组合数. 首先,多重集合的组合有一个定理,定理描述如下: 设S是有k种

STL set集合用法总结(multiset)

2017-08-20 15:21:31 writer:pprp set集合容器使用红黑树的平衡二叉树检索树,不会将重复键值插入,检索效率高 logn 检索使用中序遍历,所以可以将元素从小到大排列出来 /* name : usage of Set writer : pprp declare : null date : 2017/8/20 */ #include <bits/stdc++.h> using namespace std; void print(set<int> &

STL - set和multiset

set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树.在插入操作和删除操作上比vector快. set不可以直接存取元素.(不可以使用at.(pos)与[]操作符). multiset与set的区别:set支持唯一键值,每个元素值只能出现一次:而multiset中同一值可以出现多次. 不可以直接修改set或multiset容器中的