NC15976 小C的周末
题目
题目描述
愉快的周末到了,小C和他的N-1个朋友买了M个游戏,游戏编号从1~M。每个游戏都是多人游戏,他们打算周末一起打游戏。
小C的每个朋友都决定好了要玩哪一款游戏(会有一组人打同一款游戏),并且每人手上都有一台游戏机,这种游戏机可以通过特定的游戏机连接线连接起来。
但是,他们面临着一个问题:目前没有一个朋友的游戏机是互相连接的。所以它们必须用可用的游戏机连接线连接起来。小C决定依次使用第 i 条连接线把他的朋友 ui 和 vi 的游戏机连接起来。也就是说,假设有Q条连接线,小C只能先使用第一条,然后使用第二条,然后使用第三条。。。最后使用第Q条。
一个游戏能开始的条件是所有玩这个游戏的朋友的游戏机都被连接起来(如果不是直接连接的话,那么就必须存在一条连接它们的路径)。他们希望尽快开始比赛。
在每个游戏中,找出在添加了第几条连接线之后能开始游戏。如果在一个游戏中只有一个人玩,则输出0(因为他立马可以开始游戏)。如果不存在,则输出-1
输入描述
多组输入
第一行包含三个整数N,M,Q。
第二行给N个用空格分隔的整数,第 i 个整数代表第 i 个朋友想玩的游戏。
接下来的Q行,每行两个整数(u, v),代表电线 i 连接的两个人的电脑
1 <= N, M <= 10^5
0 <= Q <= 10^5
输出描述
对于每个游戏,输出一个整数,表示添加了第几条连接线之后能开始游戏,每行以换行符结束
示例1
输入
5 2 4
1 2 2 2 1
1 2
2 3
1 5
4 5
输出
3
4
说明
第一个游戏有两个人参加(1,5),在添加了第三条电线之后他们电脑互相连接
第二个游戏三个人参加(2, 3, 4),在添加第四条电线之后他们电脑互相连接
题解
知识点:并查集。
这道题用单纯的并查集维护互联关系是不够的,需要权值去表达哪些有些连了那些人。由于每个人只可能玩一个游戏,那么只要计数相等那么就说明人齐了。
所以先用 \(cnt[i]\) 记录第 \(i\) 个游戏有多少人。权值用 \(map\) 数组维护,\(map[i]\) 代表第 \(i\) 个人作为根节点时,其集合里游戏以及对应的人数。
合并时遍历被合并的权值 \(map\) 加入父集合的权值 \(map\) ,过程中用 \(ans[i]\) 记录第 \(i\) 个游戏在第几根线连接时能够开始游戏,因为要按游戏编号输出所以用游戏编号作为下标记下来。
最后按顺序输出 \(ans\) 即可。
要注意有些游戏可能只有一个人,那么在输出时先判断是不是一个人,再输出 \(0\) 即可;也有可能有些游戏没人玩,直接输出 \(-1\) 。\(ans\) 初始化为 \(-1\) 因为某些游戏可能能玩的人到最后还不够所以没更改 \(ans\) 就可以直接输出 \(-1\)。
注意是多组数据输入。
时间复杂度 \(O(q\log n + (n+m)\log m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
using namespace std;
int fa[100007], cnt[100007], ans[100007];///fa表示连接起来的人,cnt记录每个游戏人数,ans记录答案因为最后按游戏排序
unordered_map<int, int> mp[100007];///mp[i][j] 第i个根节点的游戏种类及其对应数量
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, q;
while (cin >> n >> m >> q) {
memset(ans, -1, sizeof(ans));
memset(cnt, 0, sizeof(cnt));
for (int i = 1;i <= n;i++) fa[i] = i, mp[i].clear();
for (int i = 1;i <= n;i++) {
int tmp;
cin >> tmp;
cnt[tmp]++;
mp[i][tmp] = 1;
}
for (int t = 1;t <= q;t++) {
int u, v;
cin >> u >> v;
u = find(u);
v = find(v);
if (mp[u].size() > mp[v].size()) swap(u, v);
fa[u] = v;
for (auto [i, j] : mp[u]) {
mp[v][i] += j;
if (mp[v][i] == cnt[i]) ans[i] = t;
}
}
for (int i = 1;i <= m;i++) {
if (cnt[i] <= 1) cout << cnt[i] - 1 << '\n';
else cout << ans[i] << '\n';
}
}
return 0;
}
NC15976 小C的周末的更多相关文章
- 小圣求职记A:腾讯篇
本人普通985高校计算机专业研究生一枚,从9月12号开始正式找工作,一个月过去了,参加了能参加的各个互联网公司的宣讲.笔试.面试,现用两篇随笔分享所见所闻.随笔A将以腾讯为例详细展示整个过程,随笔B将 ...
- 一堆Offer怎么选?这样做就不纠结了
有个朋友,工作了10年左右,春节后换工作,拿了三个Offer(西安): 通信行业的一家研究所,软件开发工程师,月薪7K,承诺有月奖金.年终奖金 一家做大数据的公司,软件开发工程师,月薪15K,13薪 ...
- TCP/IP网络协议初识
目录 一.什么是协议? 二.什么是TCP/IP协议? 三.TCP/IP为什么这么多协议? 四.TCP/IP协议为什么分层? 五.TCP/IP协议如何入门? 六.TCP/IP 的分层: 七.各协议层打包 ...
- 腾讯2020校园招聘-后台&综合-第一次笔试 题解
对数据结构和算法感兴趣的可以关注一下https://github.com/MCQ1999/Datastructure_Algorithm_Solutions,分享算法题的解题思路和代码~ 1.压缩算法 ...
- 牛客腾讯2020校园招聘-后台&综合-第一次笔试
第一题 Q: 小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串 ...
- 我发现 Linux 文档写错了
作者:小林coding 图解计算机基础网站:https://xiaolincoding.com 大家好,我是小林. 周末的时候,有位读者疑惑为什么 Linux man 手册中关于 netstat 命令 ...
- 开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
前言 以前在 github 上自己开源了一些项目.碍于技术与精力,大部分项目都是 java 实现的. 这对于非 java 开发者而言很不友好,对于不会编程的用户更加不友好. 为了让更多的人可以使用到这 ...
- 无聊的周末用Java写个扫雷小游戏
周末无聊,用Java写了一个扫雷程序,说起来,这个应该是在学校的时候,写会比较好玩,毕竟自己实现一个小游戏,还是比较好玩的.说实话,扫雷程序里面核心的东西,只有点击的时候,去触发更新数据这一步. Sw ...
- 周末娱乐一下--------恶搞windows小脚本
下面这是个循环DOS命令,使用了C中的goto语句 echo命令式输出命令 set命令是设置命令 var是变量,初始为0 :continue是一个用于goto的标示. %var%输出变量名,%var% ...
- 微信小程序体验(2):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
随机推荐
- 每天学五分钟 Liunx 000 | 计算机与 Liunx
计算机 计算机是具有数据处理与逻辑运算的机器. 它有输入单元,输出单元,CPU 内部的控制单元,逻辑处理单元以及内存组成. 输入单元如鼠标键盘等输入设备: 输出单元如打印机,显示屏,等输出 ...
- SpringBoot中使用LocalDateTime踩坑记录
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- uniapp 子页面 滚动监听 是否到底
主要属性: handleScrollToLower <template> <view class="menu"> <scroll-view id=& ...
- [转帖]CentOS7使用Chrony实现时间同步
学习安装部署 ceph 时 ,在添加 mon 时报错了,搜索原因后发现是 时间同步问题.于是学习一下时间同步工具. 一般CentOS6 使用的时间同步工具是ntp.现在还有不少开源软件文档建议安装的时 ...
- [转帖]人大金仓- KWR 报告初体验
[本文正在参与炫"库"行动-人大金仓有奖征文] 开发者请集结丨炫"库"行动--2021人大金仓征文大赛悬赏万元等你来! 最近一直在研究 Oracle 的 AWR ...
- [转帖]一次操作系统报错OutOfMemory Error的处理记录
在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to contin ...
- 验证功能访问Redis的次数和命令
背景 公司内部在进行性能调优, 调优有多个方法. 应用Redis方面主要的调优有: 1. 进行redis键值对大小的处理. 2. 进行redis键值对过期时间的处理. 3. 减少连接数,减少网络带宽. ...
- nginx 负载均衡简单设置
自己简单维护了一个 需要继续改进. user nobody; worker_processes auto; events { worker_connections 1024; } http { inc ...
- mysql 获取 今天是今年的第几天, 以及 还有多少天元旦的方法
1. 获取今天是这一年的第几天 select dayofyear(curdate()); 或者是 select dayofyear(now()); 2. 获取还有多少天元旦的方法 select dat ...
- 可插拔组件设计机制—SPI
作者:京东物流 孔祥东 1.SPI 是什么? SPI 的全称是Service Provider Interface,即提供服务接口:是一种服务发现机制,SPI 的本质是将接口实现类的全限定名配置在文件 ...