标签:一起 scan href 包含 acm ret turn 大学 没有
链接:https://www.nowcoder.com/acm/contest/122/E
来源:牛客网
多组输入
第一行包含三个整数N,M,Q。
第二行给N个用空格分隔的整数,第 i 个整数代表第 i 个朋友想玩的游戏。
接下来的Q行,每行两个整数(u, v),代表电线 i 连接的两个人的电脑
1 <= N, M <= 10^5
0 <= Q <= 10^5
对于每个游戏,输出一个整数,表示添加了第几条连接线之后能开始游戏,每行以换行符结束
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; }
标签:一起 scan href 包含 acm ret turn 大学 没有
原文地址:https://www.cnblogs.com/yinghualuowu/p/9063333.html