Submission #1150756

#TimeUsernameProblemLanguageResultExecution timeMemory
1150756ChuanChen낙하산 고리들 (IOI12_rings)C++20
0 / 100
612 ms125576 KiB
#include<bits/stdc++.h>
using namespace std;
const int lim = 1e6+5;

struct UF{
	int N;
	int pai[lim], qtd_vert[lim], deg[lim];
	int circle_sz;

	UF(){}
	UF(int _N){
		N = _N;
		circle_sz = 0;
		for(int i = 1; i <= N; i++){
			pai[i] = i;
			qtd_vert[i] = 1;
		}
	};

	int CRings(){
		if(circle_sz == 0) return N;
		if(circle_sz == -1) return 0;
		return circle_sz;
	}

	void newCircle(int no){
		if(circle_sz == 0){
			circle_sz = qtd_vert[no];
		}
		else{
			circle_sz = -1;
		}
	}

	int find(int no){
		if(pai[no] == no) return no;
		return pai[no] = find(pai[no]);
	}

	void merge(int a, int b){
		deg[a]++; deg[b]++;
		if(deg[a] > 2 || deg[b] > 2) circle_sz = -1;

		a = find(a); b = find(b);
		if(qtd_vert[a] < qtd_vert[b]) swap(a, b);// a será novo representante
		pai[b] = a;
		if(a != b) qtd_vert[a] += qtd_vert[b];
		else newCircle(a);
	}
};

UF princ, rt, v1, v2, v3;
int n, ROOT, V1, V2, V3;
vector<pair<int, int>> linked;
void Init(int N_) {
	n = N_;
	princ = UF(n);
}

bool deg3 = false;
vector<int> adj[lim];

void buildSubUF(int root){
	deg3 = true;
	ROOT = root;
	V1 = adj[root][0];
	V2 = adj[root][1];
	V3 = adj[root][2];

	rt = UF(n);
	v1 = UF(n);
	v2 = UF(n);
	v3 = UF(n);

	for(auto no : linked){
		int A = no.first, B = no.second;

		if(A != ROOT && B != ROOT) rt.merge(A, B);
		if(A != V1 && B != V1) v1.merge(A, B);
		if(A != V2 && B != V2) v2.merge(A, B);
		if(A != V3 && B != V3) v3.merge(A, B);
	}
}

void Link(int A, int B) {
	A++; B++;
	adj[A].push_back(B);
	adj[B].push_back(A);
	linked.emplace_back(A, B);
	if(!deg3){ //link normal nos main UF
		princ.merge(A, B);

		if(princ.deg[A] > 2){
			buildSubUF(A);
			return;
		}
		if(princ.deg[B] > 2){
			buildSubUF(B);
			return;
		}
	}
	else{
		//link nos 4 sub UF;
		if(A != ROOT && B != ROOT) rt.merge(A, B);
		if(A != V1 && B != V1) v1.merge(A, B);
		if(A != V2 && B != V2) v2.merge(A, B);
		if(A != V3 && B != V3) v3.merge(A, B);
	}
}

int CountCritical() {
	if(deg3) return rt.CRings()+v1.CRings()+v2.CRings()+v3.CRings();
	else return princ.CRings();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...