牛客(多校8):I – Interesting Computer Game

   日期:2020-08-05     浏览:91    评论:0    
核心提示:题目链接题目大意:给了两个数组:{#, %, ⋯ , “’}, )#, )%, ⋯ , )’ . * ≤ 10.第 i 步可以从”/和)/中选择一个数。求最后选出的数中,不同的数要最多。题解:把不同的数当成图中的点。二元组 !, $ 当成是一条边。答案就是:总点数 - #(k个点,k-1条边的连通分量)。复杂度:O(n)代码:#include using namespace std;const int MAXN = 100010;_牛客多校i

题目链接

题目大意:

题解

代码:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100010;
int F[MAXN*2];
void init() {
	memset(F, -1, sizeof(F));
}
int a[MAXN], b[MAXN];
int c[MAXN*2];
int find(int x) {
	if (F[x] == -1) return x;
	return F[x] = find(F[x]);
}
bool vis[MAXN*2];
void bing(int x, int y) {
	int t1 = find(x);
	int t2 = find(y);
	if (t1 == t2) {
		vis[t1] = true;
		return;
	}
	F[t1] = t2;
	if (vis[t1]) vis[t2] = true;
}

int main() {
	int T;
	scanf("%d", &T);
	int iCase = 0;
	while (T--) {
		iCase++;
		init();
		memset(vis, false, sizeof(vis));
		int n;
		scanf("%d", &n);
		int tot = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d%d", &a[i], &b[i]);
			c[tot++] = a[i];
			c[tot++] = b[i];
		}
		sort(c, c+tot);
		tot = unique(c, c+tot) - c;
		for (int i = 0; i < n; i++) {
			int x = lower_bound(c, c+tot, a[i]) - c;
			int y = lower_bound(c, c+tot, b[i]) - c;
			bing(x, y);
		}
		int ans = tot;
		for (int i = 0; i < tot; i++)
			if (F[i] == -1 && !vis[i])
				ans--;
		printf("Case #%d: %d\n", iCase, ans);
	}
	return 0;
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服