集合(map+set)

news2024/11/17 1:48:41

【数据结构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");
		else
		printf("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.coloradmin.cn/o/889010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交流充电桩控制主板的模块结构

交流充电桩控制主板的模块结构 你是否好奇过&#xff0c;交流充电桩是如何给电动汽车充电的?充电桩的控制主板又是由哪些部分组成的呢?今天我们就来一探究竟! 首先&#xff0c;让我们来看看主控制器。主控制器可谓是交流充电桩主板的大脑&#xff0c;它负责控制充电桩的工作流…

【boost网络库从青铜到王者】第四篇:asio网络编程中的socket同步读(接收)写(发送)

文章目录 1、asio中的同步发送write_some()2、asio中的socket中的同步发送send() 可以在一次性同步发送所以数据出去3、asio中的write()发送数据4、asio中的同步接收read_some()5、asio中的socket中的同步接收receive()可以一次性同步接收对方发送的数据6、asio中的read()接收数…

OpenAI全球招外包大军,手把手训练ChatGPT取代码农 ; 码农:我自己「杀」自己

目录 前言 OpenAI招了一千多名外包人员&#xff0c;训练AI学会像人类一样一步步思考。如果ChatGPT「学成归来」&#xff0c;码农恐怕真的危了&#xff1f; 码农真的危了&#xff01; 当时OpenAI也说&#xff0c;ChatGPT最合适的定位&#xff0c;应该是编码辅助工具。 用Cha…

matlab使用教程(17)—多项式的定义和运算

1.创建并计算多项式 此示例说明如何在 MATLAB 中将多项式表示为向量以及根据相关点计算多项式。 1.1 表示多项式 MATLAB 将多项式表示为行向量&#xff0c;其中包含按降幂排序的系数。例如&#xff0c;三元素向量 p [p2 p1 p0]; 表示多项式 创建一个向量以表示二次多项式…

mysql 存储过大如何处理

文章目录 定位是否MySQL存储过大处理binlog大小查看目前存储策略设置binlog 保存时间 定位是否MySQL存储过大 查询当前文件夹大小 du -sh查询第一层文件夹大小 du -h -d 1处理binlog大小 查看目前存储策略 查询日志保存天数 show variables like expire_logs_days;0&…

大势智慧软硬件技术答疑第八期

1.DasViewer可以使用同一个账号登录多台电脑&#xff0c;然后同时进行格式转换操作吗&#xff1f; 答&#xff1a;可以的 2.在DasViewer里面添加了标注点&#xff0c;能手动修改标注点坐标、手动输入坐标值 吗&#xff1f; 答&#xff1a;目前DasViewer暂不支持手动输入坐标 …

Android12 偶现触摸失灵

生产线 在烧录固件时&#xff0c;会偶然出现稍完之后屏幕触摸用不了。前期以为是烧录没弄好&#xff0c;后面又发生&#xff0c;就怀疑与产品有关了。 首先进行抓日志分析&#xff1a;有问题的设备先确认下dmesg信息 adb连接设备进行日志抓取&#xff1a; logcat > /sdcard…

【Go】锁相关

mutex锁相关 mutex源码分析 Locker接口&#xff1a; type Locker interface {Lock()Unlock() }Mutex 就实现了这个接口&#xff0c;Lock请求锁&#xff0c;Unlock释放锁 type Mutex struct {state int32 //锁状态&#xff0c;保护四部分含义sema uint32 //信号量&#…

IDEA启动报错【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】

IDEA报错如下&#xff1a; 2023-08-17 11:26:15.535 ERROR [egrant-biz,b48324d82fe23753,b48324d82fe23753,true] 24108 --- [ XNIO-1 task-1] c.i.c.l.c.RestExceptionController : 服务器异常org.springframework.jdbc.BadSqlGrammarException: ### Error queryin…

看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

C# WPF ListBox 动态显示图片

前言 最近在和其他软件联合做一个本地图片选择传输功能&#xff0c;为此希望图片能够有序的呈现在客户端&#xff0c;简单的实现了一下功能&#xff0c;通过Mvvm模式进行呈现&#xff0c;过程简单通俗&#xff0c;话不多说直接上图。 处理过程 前台代码 你只需要粘贴到你的前台…

linux动态链接之.plt与.got.plt

1. 动态链接 一个 main.c 文件 #include <stdio.h> #include <stdlib.h>int main() {puts("123");puts("456");return 0; }此时我们编译它默认会使用动态链接默认生成a.out可执行文件 gcc main.c当第一次调用puts函数时&#xff0c;会去往.…

考公-判断推理-逻辑判断-真假推理

真假推理最多考一道 例题 找矛盾 例题 例题 四组 例题 例题 例题 例题 例题 例题 例题

Keburnetes 配置资源管理 Secret ConfigMap

Secret 资源 用于保存密码文件、tls证书/私钥文件、token令牌字符串、镜像私有仓库认证信息 等需要加密的敏感的信息 Secret资源的 4 种类型 Opaque&#xff1a;默认的Secret资源类型&#xff0c;可以通过选项引用文件、目录、键值对的方式创建Secret资源&#xff0c;并且资…

在APP中如何嵌入小游戏?

APP内嵌游戏之所以能火爆&#xff0c;主要是因为互联网对流量的追求是无止境的&#xff0c;之前高速增长的红利期后&#xff0c;获取新的流量成为各大厂商的挑战&#xff0c;小游戏的引入&#xff0c;就是这个目的&#xff0c;为已有的产品赋能&#xff0c;抢占用户注意力和使用…

文件夹数据加密怎么设置?文件夹数据加密软件哪个好?

文件夹是电脑存放重要数据的载体&#xff0c;我们需要保护其数据安全&#xff0c;那么文件夹数据加密该怎么设置呢&#xff1f;下面我们就来盘点一下文件夹数据加密软件。 EFS加密 提起文件夹加密&#xff0c;很多人想到的就是EFS加密&#xff0c;它可以加密NTFS卷的各种文件或…

【RP2040】香瓜树莓派RP2040之新建工程

本文最后修改时间&#xff1a;2022年09月05日 11:02 一、本节简介 本节介绍如何新建一个自己的工程。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico开发板 ①树莓派pico开发板*2 ②micro usb数据线*2 2&#xff09;电脑 2、软件平台 1&#xff09;VS CODE 三、版…

ThreadLocal内存泄漏问题

引子&#xff1a; 内存泄漏&#xff1a;是指本应该被GC回收的无用对象没有被回收&#xff0c;导致内存空间的浪费&#xff0c;当内存泄露严重时会导致内存溢出。Java内存泄露的根本原因是&#xff1a;长生命周期的对象持有短生命周期对象的引用&#xff0c;尽管短生命周期对象已…

为什么 ThreadLocal 会导致内存泄漏 ?如何解决 ?

面试官问 &#xff1a;为什么 ThreadLocal 会导致内存泄漏 &#xff1f;&#xff1f; 在面试中被问到这个问题&#xff0c;如果记不清细节了&#xff0c;可以这样回答&#xff1a; ThreadLocal 里面存储的数据&#xff0c;它的生命周期是和线程或者线程池的生命周期保持一致的…

JavaWeb-DAO设计模式

目录 DAO设计模式 1.认识DAO 2.DAO各部分的详解 3.DAO设计模式流程 DAO设计模式 1.认识DAO DAO(Data Acess Object 数据库访问对象)的主要功能是操作数据库&#xff0c;所以DAO在标准开发架构中数据数据层&#xff0c;以下是标准开发的架构 客户层&#xff1a;目前使用B/…