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 ...
随机推荐
- Net中的常见的关键字
Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- iOS Interface Builder:在.xib文件中加载另一个.xib文件
在开发中,经常会用到一个需要重复使用的模块,比如好友列表中每个用户的展示或每条动态,这些都是相同的模版,这样我们就可以把这个部分提取出来放到一个单独的.xib中.那么提取出的.xib如何在其他.xib ...
- DataNavigatorButtons
备注 您可以访问使用该控件的DataNavigator.Buttons属性显示在一个的DataNavigator控制按钮设置.该属性的返回值是一个DataNavigatorButtons对象. 下图说 ...
- 十五天精通WCF——第一天 三种Binding让你KO80%的业务
转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...
- C#实现微信开发前奏
不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,链接给你 http://mp.weixin.qq.com/debug/cgi ...
- Java web.xml 配置详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- GJM : Unity3D HIAR -【 快速入门 】 三、导入 SDK
导入 SDK 本文将向您介绍如何在 Unity 工程中导入 HiAR SDK for Unity.在开始之前,请先访问 HiAR 官网下载最新版本的 SDK. 下载 HiAR SDK for Unit ...
- PowerDesigner 常用设置
1.使用 JDBC 方式连接 Oracle 逆向生成数据库 PDM 使用 ODBC 方式连接 Oracle 数据库可以借鉴这位兄弟的博客:http://www.cnblogs.com/clivehua ...
- mui 手势事件配置
在开发中监听双击屏幕事件时不起作用,需要在mui.init方法的gestureConfig参数中设置需要监听的手势事件 手势事件配置: 根据使用频率,mui默认会监听部分手势事件,如点击.滑动事件:为 ...