社区讨论

关于吸氧

P8403[CCC 2022 J4] Good Groups参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo3384ek
此快照首次捕获于
2023/10/24 00:03
2 年前
此快照最后确认于
2023/10/24 00:03
2 年前
查看原帖
是map+并查集的做法。
直接交85pts,subtask#3有几个TLE,看了题解说开O2能过,但是我开了就全MLE了……
CPP
#include<iostream>
#include<map>
using namespace std;

const int N = 1e5+10;
map<string,int> mp;
int a[N],p[N];
pair<int,int> same[N],dif[N];
int n,m,q;

int find(int x){
	if(x != p[x]) return p[x] = find(p[x]);
}

void solve(){
	int t = 0,k1 = 0,k2 = 0;
	scanf("%d",&n);
	for(int i = 1; i < N; i++) p[i] = i;
	for(int i = 1; i <= n; i++){
		string s1,s2;
		cin >> s1 >> s2;
		if(!mp[s1]) mp[s1] = ++t;
		if(!mp[s2]) mp[s2] = ++t;
		int a = mp[s1],b = mp[s2];
		same[++k1] = {a,b};
	}
	scanf("%d",&m);
	for(int i = 1; i <= m; i++){
		string s1,s2;
		cin >> s1 >> s2;
		if(!mp[s1]) mp[s1] = ++t;
		if(!mp[s2]) mp[s2] = ++t;
		int a = mp[s1],b = mp[s2];
		dif[++k2] = {a,b};
	}
	scanf("%d",&q);
	for(int i = 1; i <= q; i++){
		string s1,s2,s3;
		cin >> s1 >> s2 >> s3;
		if(!mp[s1]) mp[s1] = ++t;
		if(!mp[s2]) mp[s2] = ++t;
		if(!mp[s3]) mp[s3] = ++t;
		int a = mp[s1],b = mp[s2],c = mp[s3];
		if(find(a) != find(b)) p[find(a)] = find(b);
		if(find(b) != find(c)) p[find(b)] = find(c);
	}
	int ans = 0;
	for(int i = 1; i <= k1; i++){
		int a = same[i].first,b = same[i].second;
		if(find(a) != find(b)) ans++;
	}
	for(int i = 1; i <= k2; i++){
		int a = dif[i].first,b = dif[i].second;
		if(find(a) == find(b)) ans++;
	}
	printf("%d\n",ans);
}

int main(){
	int t = 1;
//	scanf("%d",&t);
	while(t--) solve();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...