Warning: session_start(): open(/tmp/sess_448ee8194f992e8039ca50ff886156fe, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430

Warning: mkdir(): No space left on device in /data/wiki/lib/plugins/dw2pdf/vendor/mpdf/mpdf/src/Cache.php on line 19
Temporary files directory "/data/wiki/data/tmp/dwpdf/117/" is not writable
Writing /data/wiki/data/cache/d/de2edb2fcb553ea79b79c722a4e13dbc.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:namespace:牛客多校第八场 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:namespace:牛客多校第八场

牛客多校第八场

想起高中时看的一本大黑砖:

《我怎样爆零(HowDoIGetZero)》

所以预计本周周报将陷入无题可写的困境。

I

比赛时以为是二分图的匹配用匈牙利算法做了,搞了半天搞出来了但是复杂度太高了过不去。

参考题解的答案是:总点数-#(k个点, k-1条边的连通分量)

点击以显示 ⇲

点击以隐藏 ⇱

#include<bits/stdc++.h>
#define _rep(i, a, n) for(int i = a; i < n; i++)
using namespace std;
const int maxn = 100010;
bool vis[maxn * 2];
int F[maxn * 2];
void init() {
	memset(F, -1, sizeof(F));
	memset(vis, false, sizeof(vis));
}
int find(int x) {
	if (F[x] == -1) return x;
	return F[x] = find(F[x]);//改了根 
}
void bing(int x, int y) {
	int t1 = find(x);//找到x的根 
	int t2 = find(y);//找到y的根 
	if (t1 == t2) {
		vis[t1] = true;//同一个根,该根变true 
		return;
	}
	F[t1] = t2;//如果x和y的根不同,修改t1的根t2 
	if (vis[t1]) vis[t2] = true;
}
int main() {
	int t;
	cin >> t;
	int k = 0;
	while(t--) {
		k++;
		init();
		int n;
		cin >> n;
		vector<int> a(n), b(n);
		vector<int> val;
		_rep(i, 0, n){
			cin >> a[i] >> b[i];
			val.push_back(a[i]);
			val.push_back(b[i]);
		}
		sort(val.begin(), val.end());
		int tot = unique(val.begin(), val.end()) - val.begin();
		val.resize(tot);
		_rep(i, 0, n){
			a[i] = lower_bound(val.begin(), val.end(), a[i]) - val.begin();
			b[i] = lower_bound(val.begin(), val.end(), b[i]) - val.begin();
			bing(a[i], b[i]);
		}
		int ans = tot;
		for (int i = 0; i < tot; i++)//遍历c中不同的点 
			if (F[i] == -1 && !vis[i])
				ans--;
		printf("Case #%d: %d\n", k, ans);
	}
}
2020-2021/teams/namespace/牛客多校第八场.1596794372.txt.gz · 最后更改: 2020/08/07 17:59 由 serein