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 ...
随机推荐
- 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- [Quartz笔记]玩转定时调度
简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...
- 卷积神经网络提取特征并用于SVM
模式识别课程的一次作业.其目标是对UCI的手写数字数据集进行识别,样本数量大约是1600个.图片大小为16x16.要求必须使用SVM作为二分类的分类器. 本文重点是如何使用卷积神经网络(CNN)来提取 ...
- 高分辨率下IE浏览器缩放导致出现右侧滚动条问题的解决
0 问题描述 由于需要演示触控操作,采购了SurfacePro,SurfacePro的推荐分辨率为2736×1824,且默认缩放比例为200%,IE浏览器的默认缩放比例也是200%,这样就导致右侧出现 ...
- C# listview 单击列头实现排序 <二>
单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...
- MVC 传值
1.ViewBag Controller:ViewBag.Message = "Hello, Word"; View:@ViewBag.Message 注:View ...
- WPF binding 参考
Introduction This is an article on WPF Binding Cheat Sheet. Some of the Binding won't work for Silve ...
- BZOJ3095 : 二元组
\[\begin{eqnarray*}&&\sum_{i=0}^{n-1}\left(ki+b-a_i\right)^2\\&=&\sum_{i=0}^{n-1}\le ...
- C++ constructor
From <<C++ primer>> struct Sales_data { // constructors added Sales_data() = default; Sa ...