답안 #933883

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
933883 2024-02-26T13:15:52 Z moonrabbit2 조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2) C++17
0 / 100
7 ms 20164 KB
#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,fma")
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
using ll=long long;
const ll mod=1000000007;
const int N=100005;
int n,m;
struct UF{
	int p[N];
	ll ans=0,sz[N];
	set<int> in[N],out[N],inV[N],S[N];
	void init(){
		for(int i=1;i<=n;i++){
			p[i]=0;
			sz[i]=1;
			S[i].emplace(i);
		}
	}
	int Find(int u){
		if(!p[u]) return u;
		return p[u]=Find(p[u]);
	}
	void add(int u,int v){
		int Gu=Find(u),Gv=Find(v);
		if(Gu==Gv) return;
		if(in[Gu].count(Gv)){
			ans+=2*sz[Gu]*sz[Gv];
			ans-=sz[Gu]*inV[Gu].size();
			ans-=sz[Gv]*inV[Gv].size();
			debug(sz[Gu],sz[Gv],inV[Gu],inV[Gv]);
			if(in[Gu].size()+out[Gu].size()+inV[Gu].size()+S[Gu].size()<in[Gv].size()+out[Gv].size()+inV[Gv].size()+S[Gv].size()) swap(Gu,Gv);
			vector<int> V1,V2;
			for(int Gw: in[Gv]){
				out[Gw].erase(Gv);
				out[Gw].emplace(Gu);
				if(!out[Gu].count(Gw)) in[Gu].emplace(Gw);
				else V1.emplace_back(Gw);
			}
			for(int Gw: out[Gv]){
				in[Gw].erase(Gv);
				in[Gw].emplace(Gu);
				if(!in[Gu].count(Gw)) out[Gu].emplace(Gw);
				else V2.emplace_back(Gw);
			}
			for(int w: inV[Gv]){
				if(!S[Gu].count(w)) inV[Gu].emplace(w);
			}
			for(int w: S[Gv]){
				S[Gu].emplace(w);
				inV[Gu].erase(w);
			}
			sz[Gu]+=sz[Gv];
			ans+=sz[Gu]*inV[Gu].size();
			debug(sz[Gu],inV[Gu]);
			p[Gv]=Gu;
			for(int Gw: V1) add(Gu,Gw);
			for(int Gw: V2) add(Gw,Gu);
		} else if(!in[Gv].count(u)){
			ans+=sz[Gv];
			debug(sz[Gv]);
			in[Gv].emplace(Gu);
			out[Gu].emplace(Gv);
			inV[Gv].emplace(u);
		}
	}
}U;
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	cin>>n>>m;
	U.init();
	for(int u,v,i=1;i<=m;i++){
		cin>>u>>v;
		U.add(u,v);
		cout<<U.ans<<"\n";
	}
	return 0;
}

Compilation message

joitter2.cpp: In member function 'void UF::add(int, int)':
joitter2.cpp:10:20: warning: statement has no effect [-Wunused-value]
   10 | #define debug(...) 42
      |                    ^~
joitter2.cpp:38:4: note: in expansion of macro 'debug'
   38 |    debug(sz[Gu],sz[Gv],inV[Gu],inV[Gv]);
      |    ^~~~~
joitter2.cpp:10:20: warning: statement has no effect [-Wunused-value]
   10 | #define debug(...) 42
      |                    ^~
joitter2.cpp:62:4: note: in expansion of macro 'debug'
   62 |    debug(sz[Gu],inV[Gu]);
      |    ^~~~~
joitter2.cpp:10:20: warning: statement has no effect [-Wunused-value]
   10 | #define debug(...) 42
      |                    ^~
joitter2.cpp:68:4: note: in expansion of macro 'debug'
   68 |    debug(sz[Gv]);
      |    ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 20060 KB Output is correct
2 Correct 7 ms 20164 KB Output is correct
3 Correct 5 ms 20056 KB Output is correct
4 Correct 5 ms 20060 KB Output is correct
5 Incorrect 4 ms 20060 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 20060 KB Output is correct
2 Correct 7 ms 20164 KB Output is correct
3 Correct 5 ms 20056 KB Output is correct
4 Correct 5 ms 20060 KB Output is correct
5 Incorrect 4 ms 20060 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 20060 KB Output is correct
2 Correct 7 ms 20164 KB Output is correct
3 Correct 5 ms 20056 KB Output is correct
4 Correct 5 ms 20060 KB Output is correct
5 Incorrect 4 ms 20060 KB Output isn't correct
6 Halted 0 ms 0 KB -