南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 E

链接:https://www.nowcoder.com/acm/contest/122/E
来源:牛客网

题目描述

愉快的周末到了,小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^50 <= Q <= 10^5

输出描述:

对于每个游戏,输出一个整数,表示添加了第几条连接线之后能开始游戏,每行以换行符结束
输入例子:
5 2 4
1 2 2 2 1
1 2
2 3
1 5
4 5
输出例子:
3
4

-->

示例1

输入

5 2 4
1 2 2 2 1
1 2
2 3
1 5
4 5

输出

3
4

说明

**样例解释**

第一个游戏有两个人参加(1,5),在添加了第三条电线之后他们电脑互相连接

第二个游戏三个人参加(2, 3, 4),在添加第四条电线之后他们电脑互相连接
#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e5+55;
int cnt[maxn],x,n,m,q;
int f[maxn];
map<int,int> mp[maxn];
int res[maxn];
int find(int x){
    if(x == f[x]) return x;
    return f[x] = find(f[x]);
}
int main () {
    while(~scanf("%d%d%d",&n,&m,&q)) {
        memset(cnt,0,sizeof cnt);
        memset(res,-1,sizeof res);
        for(int i=1;i<=n;i++)
            mp[i].clear();
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            cnt[x]++;
            mp[i][x]++;
        }
        for(int i=1;i<=n;i++)
            f[i]=i;
        for(int i=1;i<=q;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            int h1 = find(u);
            int h2 = find(v);
            if(h1 == h2) continue;
            if(mp[h1].size() > mp[h2].size()){
                for(auto ep:mp[h2]) {
                    int tmp = (mp[h1][ep.first] += ep.second);
                    if(tmp == cnt[ep.first]) {
                        res[ep.first]=i;
                        mp[h1].erase(ep.first);
                    }
                }
                f[h2]=h1;
            } else {
                for(auto ep:mp[h1]) {
                    int tmp = (mp[h2][ep.first] += ep.second);
                    if(tmp == cnt[ep.first]) {
                        res[ep.first]=i;
                        mp[h2].erase(ep.first);
                    }
                }
                f[h1]=h2;
            }
        }
        for(int i=1;i<=m;i++){
            if(cnt[i]==1){
                printf("0\n");
            } else {
                printf("%d\n",res[i]);
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yinghualuowu/p/9063333.html

时间: 2024-10-08 15:30:37

南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 E的相关文章

牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值

题目描述 给出一个序列,你的任务是求序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度.然后接下来一行输入n个数,表示原先序列的样子.数据范围:3<=n<=200000-1000000000<=a[i]<=1000000000 输出描述: 每组数据输出一行一个浮点数,保留两位小数,表示所求的最大值. 示例1 输入 5 2 4 6 8 10 输出 2.00 备注: 输入只有

哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A - 所有情况的和

题目描述 在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**.每件装备有自己的属性值,能给tabris属性加成.对于不同种类的装备之间有叠加效果,如果选择多件装备,最终的属性加成为他们的乘积.若tabris初始属性值为0,最后属性加成的期望是多少. 输入描述: 有多组测试样例,输入到文件结束.每组测试数据的第一行包含一个正整数NN,表示装备的种类数.接下来N行,每

新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 猴子排序的期望

链接:https://www.nowcoder.com/acm/contest/116/F来源:牛客网 题目描述 我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡片扔在空中,等落下的时候观察这些卡片是否从左到右已经排序完成(我们认为不会发生卡片落地后叠在一起的情况)如果有序则排序完成,否则让猴子再扔一遍,直到卡片有序,那么问题来了,给你N个卡片,每个卡片上写着一个大写字母,请问猴子第一次扔这些卡片就按字典序排序完成的概率有多大? 输入描述: 第一行是一个整数

新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)F 猴子排序的期望【Java/高精度/组合数学+概率论】

链接:https://www.nowcoder.com/acm/contest/116/F 来源:牛客网 题目描述 我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡片扔在空中,等落下的时候观察这些卡片是否从左到右已经排序完成(我们认为不会发生卡片落地后叠在一起的情况)如果有序则排序完成,否则让猴子再扔一遍,直到卡片有序,那么问题来了,给你N个卡片,每个卡片上写着一个大写字母,请问猴子第一次扔这些卡片就按字典序排序完成的概率有多大? 输入描述: 第一行是一个整

&quot;巴卡斯杯&quot; 中国大学生程序设计竞赛 - 女生专场(重现)解题思路

此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场(重现)  Problem 1001 Solving Order Accept: 0    Submit: 0 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit : 32768/32768 K (Java/Others)  Problem Descri

HDU 6467 简单数学题 【递推公式 &amp;&amp; O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 308    Accepted Submission(s): 150 Problem Description 已知 F(n)=∑i=1n(i×∑j=inCij) 求 F(n) m

FZU-2231 平行四边形数 From 福州大学第十三届程序设计竞赛

FZU-Problem 2231 平行四边形数 Accept: 66 Submit: 210 Time Limit: 2000 mSec Memory Limit : 32768 KB Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形. Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<=

福州大学第十届程序设计竞赛 -- 部分题解

题目传送:福州大学第十届程序设计竞赛 Problem A 神庙逃亡 水题 AC代码: #include<cstdio> #include<cmath> #include<iostream> using namespace std; int s, h, vx, vy; int main() { int w; cin >> w; while(w--){ cin >> s >> h >> vx >> vy; long

2018 年“三盟科技杯”中国大学生程序设计竞赛(湖南)

2018 年"三盟科技杯"中国大学生程序设计竞赛(湖南) A. Easy h-index 题目描述:给出一个数组\(a_i\),求最大的\(h\),使得至少有\(h\)个数不少于\(h\). solution 模拟. 时间复杂度:\(O(nlogn)\) B. Higher h-index 题目描述:写论文,当一份论文花费了\(x\)小时时,这份论文会得到\(ax\)个引用,\(a\)是给定的常数,\(x\)必须为正整数,每份论文都可以被之后自己写的论文引用,现在有\(n\)个小时写论