codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体。
在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较。
set经常会用到迭代器,这里说明一下迭代器:可以类似的把它看成是一个“下标”,它是指向set集合中的某个元素的指针,它用来遍历这个集合。
头文件
#include<set>
#include<iterator> //set 经常会使用到迭代器,因此需要迭代器的头文件
定义二叉查找树:
set<数据类型> 名称:
multiset<数据类型> 名称; //multiset 是可重集合,set是不可重集合。
定义迭代器:
set<数据类型>::iterator 名称;
multiset<数据类型>::iterator 名称;
一些常用的操作:
插入一个元素v:
S.insert(v); //S是定义过的集合,下面相同
集合的大小:
S.size();
集合为空吗:
S.empty();
集合中最小的元素:
S.begin(); //这是一个指向那个位置的指针,若要值则要在前面加上*
*S.begin(); //前面加*就是那个位置的值
集合中最大的元素:
S.end(); //解释同上
*S.end();
集合中>=v的第一个元素:
it=S.lower_bound(v) //it是定义过的迭代器,注意集合不为空
集合中>v的第一个元素:
it=S.upper_bound(v)//要注意存在这样的>v的数,否则会溢出
迭代器操作:(a,b是定义过的迭代器)
a=b; //赋值操作
a++; //增加一位,即指向比这个元素a大一点点的那个元素
a--; //减少一位,即指向比这个元素a小一点点的那个元素
删除迭代器it指向的那个元素:
S.erase(it);
删除数字为v的那个元素(注意用在multiset时会删除所有v的元素):
S.erase(v);
从小到大输出所有集合中的元素:
copy(S.begin(),S.end(),ostream_iterator<数据类型>(cout," "));
以上就是一些常用的指令,下面看一道模板题。
题目: codevs 1285 宠物收养所
链接:http://codevs.cn/problem/1285/
个人觉得这道题的算法还是很巧妙的。
题目中说:同一时间呆在收养所中的,要么全是宠物,要么全是领养者。这就意味着不可能有人和宠物同时存在的情况,也就是有一个宠物那一个人必须领走。如果宠物少,那么就只能等在那里,等宠物来了。其实这道题中人领养宠物和宠物领养人是等价的,因此,在宠物集合为空的时候,把人当成宠物放进集合(二叉查找树)里面,就可以解决了。
还有一个小技巧,为了避免访问lower_bound的时候越界,可以在刚开始的时候加入正无穷和负无穷(一个允许的很大的值)两个边界,在结算的时候判断一下就可以了。还有要注意这个时候的集合为空的判断是S.size()==2。
附代码:
#include<cstdio>
#include<iostream>
#include<set>
#include<iterator>
using namespace std;
const int maxn=;
const int INF=(<<);
const int MOD=; int n,ans,sert;
set<int> S;
set<int>::iterator lt,rt; int main()
{
cin>>n;
S.insert(INF),S.insert(-INF);
for(int i=,x,y;i<=n;i++)
{
cin>>x>>y;
if(==S.size()) sert=x,S.insert(y);
else if(x==sert) S.insert(y);
else
{
rt=S.lower_bound(y);
lt=rt,lt--;
if(y-*lt<=*rt-y && *lt!=-INF) ans=(y-*lt+ans)%MOD,S.erase(lt);
else ans=(*rt-y+ans)%MOD,S.erase(rt);
}
}
cout<<ans<<endl;
return ;
}
codevs 1285 二叉查找树STL基本用法的更多相关文章
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL set 用法
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. ...
- STL map 用法
首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象 class pair可以将两个值视为一个单元.容器类别map和mul ...
- STL:map用法总结
一:介绍 map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能.命名空间为std,所属头文件<map> 二:常用操 ...
- 记一些stl的用法(持续更新)
有些stl不常用真的会忘qwq,不如在这里记下来,以后常来看看 C++中substr函数的用法 #include<string> #include<iostream> usin ...
- 日常笔记6C++标准模板库(STL)用法介绍实例
一.vector常见用法详解 vector翻译为向量,但是这里翻译成变长数组的叫法更好理解. 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11 ...
- c++ STL map 用法
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...
- STL vector 用法介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- STL --> set用法
set用法 一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <se ...
随机推荐
- SQL Server-聚焦INNER JOIN AND IN性能分析(十四)
前言 本节我们来讲讲联接综合知识,我们在大多教程或理论书上都在讲用哪好,哪个性能不如哪个的性能,但是真正讲到问题的实质却不是太多,所以才有了本系列每一篇的篇幅不是太多,但是肯定是我用心去查找许多资料而 ...
- JavaScript之单例实战
一.概述 所谓单例模式,顾名思义即一个类只有一个实例. 所以,当我们创建一个实例时,就必须判断其是否已经存在了这个实例,如果已经存在了这个实例,那么就返回这个已经存在的实例,无需再创建一个(单例模式嘛 ...
- (转)构建自己的AngularJS,第一部分:Scope和Digest
原翻译链接:https://github.com/xufei/Make-Your-Own-AngularJS/edit/master/01.md 原文链接:http://teropa.info/blo ...
- linux内核数据结构之kfifo
1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...
- MyCat源码分析系列之——配置信息和启动流程
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...
- [解决方案]CREATE DATABASE statement not allowed within multi-statement transaction.
CREATE DATABASE statement not allowed within multi-statement transaction. 刚开始报这个错误的时候,我上度娘搜了一下. 别人是在 ...
- C#开发微信门户及应用(37)--微信公众号标签管理功能
微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...
- asp.net MVC4——省市三级联动数据库
数据库设计
- 笔记:xubuntu下如何让系统默认使用nvidia显卡,而不是intel集显
经反复折腾,得到如下的解决方法: prime-select nvidia 简单吧,但关系是如果让它开机自动执行一次. 反复折腾了xinitrc ,~/.xinitrc , /etc/rc.local ...
- j2ee log4j集中式日志解决方案logpool-v0.2
下一个小版本会进行清理. war包下载地址 http://pan.baidu.com/s/1nvGmORn