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):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
随机推荐
- Angular系列教程之路由守卫
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 一个容易弄错的.textContent和text()问题
最近在写一些前端页面,遇到需要通过点击事件获取被点击对象的文本内容,正确代码如下: <!DOCTYPE html> <html lang="en"> < ...
- phpcms: Warning: "continue" targeting switch is equivalent to "break" 解决方案
Warning: "continue" targeting switch is equivalent to "break". Did you mean to u ...
- [转帖]Redhat 8 磁盘调度策略变化:NOOP改为NONE
说明 在 redhat 4/5/6/7版本中的NOOP调度策略,从8开始修改为NONE,官方解释: none Implements a first-in first-out (FIFO) schedu ...
- [转帖]MOUNTING AN S3 BUCKET ON WINDOWS AND LINUX
https://blog.spikeseed.cloud/mount-s3-as-a-disk/#mounting-an-s3-bucket-on-windows-server-2016 Wouldn ...
- [转帖]linux系统下grub.cfg详解和实例操作
linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文 ...
- [转帖]陈巍谈芯:NLP里比BERT更优秀的XLNet长什么样?
https://zhuanlan.zhihu.com/p/447836322 目录 收起 一.XLNet的优势 1)独得AR与AE两大绝学 2)集成了Tansformer-XL 二.XLNet的结 ...
- 获取特定端口java进程的路径的shell脚本
获取特定端口java进程的路径的shell脚本 ll /proc/`lsof -i:5200 |grep ^java |awk '{print $2}' |uniq` |grep cwd |cut - ...
- Booking.com如何在毫秒内搜索数百万个地点
译自:How Booking.com Searches Through Millions of Locations in Milliseconds Booking.com是一家与酒店.旅馆.度假租赁等 ...
- 一台不容错过的Java单元测试代码“永动机”
作者:京东零售 陈志良 作为一名京东的软件匠人,我们开发的软件支撑着数亿的用户,责任是重大的,因此我们深深地敬畏每一行代码,那如何将我们的失误降到最低呢?那就是单元测试,它会让我们树立对代码的自信心. ...