集合(map+set)

【数据结构1-3】集合 - 题单 - 洛谷

例题

P1551 亲戚

亲戚 - 洛谷

并查集

#include<bits/stdc++.h>
using namespace std;
int n,m,q,f[10010],x,y,a,b;
int find(int x)//找出x家的大佬 也就是二叉树的祖先节点
{if(f[x]==x)//x是x的爸爸,简单的来说就是x没爸爸了return x;//他是家里最大的大佬,所以返回的x就是我们所求的祖先节点return  f[x]=find(f[x]);//x不是他自己的爸爸,所以他上面还//有爸爸,我们的目标是祖先节点,所以我们此时要做的是问他
}
int main()
{scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);f[find(y)]=find(x);//合并x子集和y子集,直接把x子集的祖先节}for(int i=1;i<=q;i++){scanf("%d%d",&a,&b);if(find(a)==find(b))//如果a所在子集的大佬[前面已经解释过了]和b所在子集的大佬一样,即可知a和b在同一个集合printf("Yes\n");elseprintf("No\n");}return 0;
}

P1536 村村通

P5250 【深基17.例5】木材仓库

​​​​​​【深基17.例5】木材仓库 - 洛谷

传送门

这道题无论是map的解法还是set的解法都非常值得学习

map:

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;int main()
{map<int,int> m;int j,n,x,y;cin >> n;while(n--) {cin >> x >> y;if (x == 1) {if (m.count(y)) cout << "Already Exist" << endl;else m[y] = 1;}else {if(m.empty()) cout << "Empty" << endl;else if (m.count(y)) {m.erase(y);cout << y << endl;}else {m[y] = 1; // 假装存一下该木头auto it = m.find(y); // 指针定位auto it2 = it;//auto=map<int,int>::iterator it++; // 几种特判if (it2 == m.begin()) { // 没有比它短的cout << it->first << endl;m.erase(it);}else if (it == m.end()) { // 没有比它长的cout << (--it2)->first << endl;m.erase(it2);}// 长度比较else if (y-(--it2)->first > it->first-y) {cout << it->first << endl;m.erase(it);}else {cout << it2->first << endl;m.erase(it2);}m.erase(y); // 删掉假装存的木头}}}return 0;
}

set:

set 里面的 insert(x) 函数其实是有返回值的,会返回一个这样的奇怪的东西:pair<set<int>::iterator,bool>

返回的这个 pair 到底是什么意思呢?

这个 pair 的第二项是一个 bool 类型的东西,代表插入是否成功。(意思就是只有集合里没有 x 的时候才能插入成功),第一项是一个迭代器,如果插入成功的话,它会返回 x 在集合里的位置,我们可以这样:

set<int> s;
set<int>::iterator p = s.insert(x).first;

以后用 *p 就可以得到 x 啦!

检测是否有相同长度的木材:

if (!s.insert(t).second) cout << "Already Exist\n";

一行直接解决问题!STL大法好

这是啥意思呢?如果有相同长度的木材,插入就会失败,pair 的第二项就会返回 false,如果没有,!s.insert(t).second 这个语句就直接实现了插入的目的,这就是我说 set 更方便的原因。

set.empty() 可以直接返回集合是否为空。

虽然 set 也有 lower_bound() 和 upper_bound(),但是,

set.lower_bound(x) 是返回第一个大于等于 x 的位置,

而 set.upper_bound(x) 是返回第一个大于 x 的位置,

set.find(x) 会返回第一个 x 的位置。如果没有 x,则会返回 set.end()

set.erase(iterator),删除定位器 iterator 指向的值

set.erase(first,second),删除定位器 first 和 second 之间的值

set.erase(key_value),删除键值 key_value 的值

结合刚刚讲的这些函数,我们可以写出代码的第二部分——出货。(s 已经被定义为 set<int>

if (s.find(t) != s.end()) cout << t, s.erase(s.find(t)); // 找得到
else { // 找不到lwb = l2 = l3 = s.lower_bound(t);if (lwb == s.begin()) cout << *lwb, s.erase(lwb); // 特殊情况1,如果在最开始else if (lwb == s.end()) cout << *(-- l3), s.erase(l3); // 特殊情况2,如果在末尾else if (*lwb - t < t - *(-- l2)) cout << *(l3), s.erase(l3); // 选比较长的else cout << *(-- l3), s.erase(l3); // 选比较短的
}
cout << endl;

那么多方便的函数,果然还是 STL 大法好啊!还不快去用起来?

代码

#include <iostream>
#include <set> using namespace std;int n, op, t;
set<int>::iterator lwb, l2, l3;
set<int> s;
int main(){cin >> n;for (int i = 1;i <= n;i ++){cin >> op >> t;if (op == 1){if (!s.insert(t).second) cout << "Already Exist\n";}else {if (s.empty()){cout << "Empty\n";continue;}if (s.find(t) != s.end()) cout << t, s.erase(s.find(t));else {lwb = l2 = l3 = s.lower_bound(t);if (lwb == s.begin()) cout << *lwb, s.erase(lwb);else if (lwb == s.end()) cout << *(-- l3), s.erase(l3);else if (*lwb - t < t - *(-- l2)) cout << *(l3), s.erase(l3);else cout << *(-- l3), s.erase(l3);}cout << endl;}}
}

C++中set用法详解_byn12345的博客-CSDN博客

P5266 【深基17.例6】学籍管理

值得一说的是map的一些用法

STL中的map

STL中的map以一种效率较高的形式(红黑树)实现了映射。(C++11又提供了一种更为先进的unordered_map,基于哈希表,拥有�(1)O(1)的时间复杂度。因此这里使用map讲解,但代码中使用的是unordered_map,两种容器操作相同)

map的创建

map<A,B> mp;

即可创建一个键类型为A,值类型为B的map。

map的插入与修改

mp.insert(make_pair(a,b));

即可插入一个对象(要求a的类型为A,b的类型为B)。

此外,map还提供一种简易的插入与修改方法

mp[a]=b;

此时,如果mp中a已存在,则会将键为a的项的值设为b;否则,则会插入一个键为a,值为b的新项。

map的查询

mp[a];

查询键为a的项的值。

map的删除

mp.erase(mp.find(a));

将键为a的项删去。

查看map的大小

mp.size()

与其它STL容器相同,map也可通过size查看大小。

查看map中特定项的个数

mp.count(a)

清空map

mp.clear()

查看mp中键为a的项的个数(因为只能有一个或没有,这个函数的返回值只能为1或0)。

其实很多字符串题中map都能派上用场。说句题外话:当数据范围非常大时,map也可以当桶排序中的“桶”来用,效果也是棒呆了

当然,map也是有缺点的,单次操作它的时间复杂度是O(lg n),有时候会TLE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/93362.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache JMeter:完全指南

Apache JMeter 是一款开源的性能测试工具&#xff0c;可以用于测试 Web 应用程序、FTP 服务器、数据库等各种类型的服务器。本文将以 JMeter 5.5 为例介绍 JMeter 的使用方法。 下载和安装 由于 JMeter 是使用 Java 开发的&#xff0c;因此在运行之前必须先安装 JDK。您可以在…

解读2023年上半年财报:净利润达11.08亿元,东鹏做对了什么?

“累了、困了&#xff0c;喝东鹏特饮”&#xff0c;这句朗朗上口的广告词是很多人对于功能性饮料的第一印象。而这句经典广告词背后的公司便是如今发展如日中天的东鹏饮料。近些年&#xff0c;东鹏饮料凭借快准狠的营销、推广打法&#xff0c;迅速在功能性饮料市场攻城略地&…

PS实现多个图片转化GIF动画

PS实现多个图片转化为GIF动画步骤 一、导入图片素材1.打开PS软件&#xff0c;点击 [文件] --- [脚本] ---[将文件载入堆栈]2.选择图片3.导入成功 二、打开时间轴1.点击[窗口]---[时间轴]2.选择创建帧动画3.创建帧动画 三、创建动画1.复制帧。2.设置帧的内容。3.修改图片停留的时…

Streamlit 讲解专栏(九):深入探索布局和容器

文章目录 1 前言2 st.sidebar - 在侧边栏增添交互元素2.1 将交互元素添加至侧边栏2.2 示例&#xff1a;在侧边栏添加选择框和单选按钮2.3 特殊元素的注意事项 3 st.columns - 并排布局多元素容器3.1 插入并排布局的容器3.2 嵌套限制 4 st.tabs - 以选项卡形式布局多元素容器4.1…

使用腾讯云轻量服务器Matomo应用模板建网站流量统计系统

腾讯云百科分享使用腾讯云轻量应用服务器Matomo应用模板搭建网站流量统计系统&#xff0c;Matomo 是一款开源的网站数据统计软件&#xff0c;可以用于跟踪、分析您的网站的流量&#xff0c;同时充分保障数据安全性、隐私性。该镜像基于 CentOS 7.6 64位操作系统&#xff0c;已预…

【C++】一文带你初识C++继承

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;napori—Vaundy 1:21 ━━━━━━️&#x1f49f;──────── 3:23 …

Weak Session IDs (弱会话)

Weak Session IDs (弱会话) 当用户登录后&#xff0c;在服务器就会创建一个会话(session)&#xff0c;叫做会话控制&#xff0c;接着访问页面的时候就不用登录&#xff0c;只需要携带Sesion去访问。 sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该…

odoo-035 Pycharm git commit 提交提示 No changes detected

文章目录 问题查找解决其他&#xff1f; 问题 在 gitee 上面新建的 git 项目&#xff0c;dowanload 下来&#xff0c;在 Pycharm 中修改后发现改完就变成白色到了&#xff0c;不是绿色或蓝色的&#xff0c;然后 git commit 的时候提示 No changes detected。 查找 上面是在 …

【设计模式】简单工厂模式

文章目录 问题&#xff1a; 简单写一个计算器&#xff0c;输入2个数和运算符&#xff0c;得到结果。 分析&#xff1a; 这一题看上去很简单&#xff0c;但如果面试时你写的是下面这种代码&#xff0c;那大概率是过不了的。 上面代码也能实现题目的功能&#xff0c;但是代码没有…

JetPack Compose 学习笔记(持续整理中...)

1.为什么要学&#xff1f; 1.命令式和声明式 UI大战,个人认为命令式UI自定义程度较高,能更深入到性能,内存优化方面,而申明式UI 是现在主流的设计,比如React,React Native,Flutter,Swift UI等等,现在性能也逐渐在变得更好 2.还有一个原因compose 是KMM 是完整跨平台的UI基础 3.…

【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤

文章目录 1、Pycharm端的设置操作2、Github端的设置操作3、Pycharm上配置Github4、Git本地项目至GitHub仓库5、前往Github中查看确认6、常见报错 1、Pycharm端的设置操作 通过CtrlAltS快捷组合键的方式&#xff0c;打开设置&#xff0c;导航到版本控制一栏中的Git&#xff0c;…

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…

无涯教程-Perl - system函数

描述 该函数执行PROGRAM指定的命令,并将LIST作为参数传递给该命令。 返回值是等待功能返回的程序的退出状态。要获得实际的退出值,请除以256。 语法 以下是此函数的简单语法- system PROGRAM, LISTsystem PROGRAM返回值 此函数返回wai返回的程序的退出状态 例 以下是显…

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新&#xff0c;京东APP内部的Flutter业务也日益增多&#xff0c;Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验&#xff0c;但随之也带来了一些OOM问题&#xff0c;通过线上监控信息…

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…

Golang通过alibabaCanal订阅MySQLbinlog

最近在做redis和MySQL的缓存一致性&#xff0c;一个方式是订阅MySQL的BinLog文件&#xff0c;我们使用阿里巴巴的Canal的中间件来做。 Canal是服务端和客户端两部分构成&#xff0c;我们需要先启动Canal的服务端&#xff0c;然后在Go程序里面连接Canal服务端&#xff0c;即可监…

Rabbitmq消息不丢失

目录 一、消息不丢失1.消息确认2.消息确认业务封装2.1 发送确认消息测试2.2 消息发送失败&#xff0c;设置重发机制 一、消息不丢失 消息的不丢失&#xff0c;在MQ角度考虑&#xff0c;一般有三种途径&#xff1a; 1&#xff0c;生产者不丢数据 2&#xff0c;MQ服务器不丢数据…

MySQL索引(Index)

Index 数据库中的索引&#xff08;Index&#xff09;是一种数据结构&#xff0c;用于提高数据库查询性能和加速数据检索过程。索引可以看作是数据库表中某个或多个列的数据结构&#xff0c;类似于书中的目录&#xff0c;可以帮助数据库管理系统更快地定位和访问数据。它们是数…

Docker 容器内无法使用vim命令 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 进入Docker容器后 无法使用vim编辑器,出现如下问题:bash: vim: command not found 如图所示: 想着通过apt-get 安装vim,出现如下问题: root@b9f0fd330d5b:/# apt-get install vim Reading package lists... Done B…

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");