제출 #1249343

#제출 시각아이디문제언어결과실행 시간메모리
1249343anhkhoa조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
0 / 100
5 ms9792 KiB
#include<bits/stdc++.h>
using namespace std;
set<int> vao[100009],ra[100009];
int n,m,root[100009],num[100009];

int find(int u) {
	if(u!=root[u]) root[u]=find(root[u]);
	return root[u];
}

int main () {
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n;i++) {
		root[i]=i;
		num[i]=1;
	}
	long long ans=0;
	for (int i=1;i<=m;i++) {
		int u,v;
		cin>>u>>v;
		int rootu=find(u);
		int rootv=find(v);
		set<int>::iterator ret=vao[rootu].find(rootv);
		if(rootu==rootv||vao[rootv].find(rootu)!=vao[rootv].end()) {
			cout<<ans<<endl;
			continue;
		}
		if(ret==vao[rootu].end()) {
			ans+=num[rootv];
			ra[rootu].insert(rootv);
			vao[rootv].insert(rootu);
			//if(u==3&&v==4) cout<<"YES"<<endl;
		} else {
			ans+=num[rootv]*num[rootu];
	//	ans+=num[rootu]*num[rootv]-1;
			vao[rootu].erase(ret);
		//	ans-=vao[rootu].size();
		//	ans-=vao[rootv].size();
			ans+=num[rootu]*(vao[rootv].size());//+num[rootv]);
			ans+=num[rootv]*(vao[rootu].size());//+num[rootu]);
		//	cout<<ans<<endl;
			ra[rootu].insert(v);
			vao[rootv].insert(u);
			if(vao[rootu].size()+ra[rootu].size()<vao[rootv].size()+ra[rootv].size()) {
				swap(rootu,rootv);
			}
			root[rootv]=rootu;
			num[rootu]+=num[rootv];
			if(!vao[rootv].empty())
			for (set<int>::iterator it=vao[rootv].begin();it!=vao[rootv].end();it++) {
				vao[rootu].insert(*it);
			}
			if(!ra[rootv].empty())
			for (set<int>::iterator it=ra[rootv].begin();it!=ra[rootv].end();it++) {
				ra[rootu].insert(*it);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...