Submission #578873

#TimeUsernameProblemLanguageResultExecution timeMemory
578873AngusWongParachute rings (IOI12_rings)C++17
20 / 100
4093 ms101704 KiB
#include <bits/stdc++.h>
using namespace std;
 
const int N=1e6+1;
int n, viss, cnt[N], dsu[N], sz[N];
vector<int> v[N], v2;
set<int> crit, tmp;
int vis[N], par[N];
vector<int> cyc;
 
int find(int x){
	return dsu[x]==x? x: dsu[x]=find(dsu[x]);
}
 
void join(int x, int y){
	x=find(x), y=find(y);
	sz[y]+=sz[x];
	dsu[x]=y;
}
 
void Init(int N_) {
	n=N_, viss=0;
	for (int i=0; i<n; i++){
		cnt[i]=0;
		dsu[i]=i, sz[i]=1;
		v[i].clear();
		crit.insert(i);
		vis[i]=0, par[i]=-1;
	}
	cyc.clear();
}
 
void setcrit(vector<int> v){
	tmp.clear();
	for (int i: v){
		if (crit.find(i)!=crit.end()) tmp.insert(i);
	}
	crit=tmp;
}
 
void dfs(int x, int st, int ed, int prev=-1){
	vis[x]=viss, par[x]=prev;
    if (x==ed){
        int t=x;
		while (t!=st){
			cyc.push_back(t);
			t=par[t];
			assert(t!=-1);
		}
        cyc.push_back(st);
		setcrit(cyc);
        return;
    }
	for (int i: v[x]){
		if (vis[i]!=viss){
			dfs(i, st, ed, x);
			continue;
		}
	}
	vis[x]=2;
}
 
void Link(int A, int B) {
	cnt[A]=min(cnt[A]+1, 4), cnt[B]=min(cnt[B]+1, 4);
	if (find(A)!=find(B)) join(A, B);
	else{
        viss++;
        cyc.clear();
		dfs(A, A, B);
	}
	v[A].push_back(B);
	v[B].push_back(A);
	if (cnt[A]==3){
		v2=v[A];
		v2.push_back(A);
		setcrit(v2);
	}else if (cnt[A]==4) setcrit({A});
	if (cnt[B]==3){
		v2=v[B];
		v2.push_back(B);
		setcrit(v2);
	}else if (cnt[B]==4) setcrit({B});
}
 
int CountCritical() {
	return crit.size();
}
#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...