답안 #578317

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
578317 2022-06-16T11:09:46 Z WongChun1234 낙하산 고리들 (IOI12_rings) C++14
37 / 100
2727 ms 178572 KB
#include<bits/stdc++.h>
using namespace std;
const int N=1000050;
int n,ord[N],par[N],cyc,cycgrp[N],cn[N];
vector<int> must,adj[N],preord;
vector<pair<int,int>> lz;
bool failed,incyc[N],vis[N];
map<pair<int,int>,bool> hv;
 
void Init(int N_) {
	n=N_;
	failed=0;
	cyc=-1;
	preord=must={};
	for (int i=0;i<n;i++) ord[i]=0,adj[i].clear(),par[i]=cycgrp[i]=i,incyc[i]=vis[i]=0,cn[i]=-1;
}
 
void checknode(int u){
	if (must.empty()){
		must.push_back(u);
		for (int i=0;i<3;i++) must.push_back(adj[u][i]);
	}else{
		vector<int> nw={};
		for (int i:must){
			bool ok=0;
			if (i==u) ok=1;
			for (int j=0;j<3;j++) if (i==adj[u][j]) ok=1;
			if (ok) nw.push_back(i);
		}
		must=nw;
		if (must.empty()) failed=1;
	}
}
 
void failnode(int u){
	vector<int> nw={};
	for (int i:must){
		bool ok=0;
		if (i==u) ok=1;
		if (ok) nw.push_back(i);
	}
	must=nw;
	if (must.empty()) failed=1;
}
 
int find(int u){
	return (par[u]==u?u:par[u]=find(par[u]));
}
 
int ff(int u){
	return (cycgrp[u]==u?u:cycgrp[u]=ff(cycgrp[u]));
}
 
void merge(int u,int v){
	if (cn[ff(u)]!=-1&&cn[ff(v)]!=-1&&cn[ff(u)]!=cn[ff(v)]){
		cycgrp[ff(u)]=ff(v);
		cn[ff(v)]=INT_MAX;
	}else if (cn[ff(u)]!=-1){
		cycgrp[ff(v)]=ff(u);
	}else{
		cycgrp[ff(u)]=ff(v);
	}
}
 
void dfs(int u,int v){
	vis[u]=1;
	preord.push_back(u);
	for (int i:adj[u]){
		if (i==v){
			incyc[v]=1;
			for (int j:preord) incyc[j]=1;
			if (must.empty()){
				must.push_back(v);
				for (int j:preord) must.push_back(j);
			}
			return;
		}else if (vis[i]) continue;
		dfs(i,v);
	}
	preord.pop_back();
}
 
int cnt,pp[N],ecnt[N];
int fff(int u){
	return (pp[u]==u?u:pp[u]=fff(pp[u]));
}
int cccnt=0;
int CountCritical() {
	//for (int i:must) cerr<<i<<" ";
	//cerr<<"!\n";
	int ret;
	if (failed) ret=0;
	else if (must.size()) ret=must.size();
	else ret=n;
	return ret;
	/*cnt=0;
	for (int i=0;i<n;i++){
		bool ok=1;
		for (int j=0;j<n;j++) pp[j]=j,ecnt[j]=0;
		for (auto j:lz){
			if (j.first==i||j.second==i) continue;
			if (fff(j.first)==fff(j.second)) ok=0;
			ecnt[j.first]++; ecnt[j.second]++;
			if (ecnt[j.first]>2||ecnt[j.second]>2) ok=0;
			pp[fff(j.first)]=j.second;
			if (!ok) break;
		}
		cnt+=ok;
	}
	if (ret>cnt) assert(cnt==0);
	//tle cnt!=0
	//re cnt=0
	return ret;*/
}
 
void Link(int u, int v) {
	hv[{u,v}]=1;
	ord[u]++; ord[v]++;
	adj[u].push_back(v); adj[v].push_back(u);
	if (failed) goto skip;
	lz.push_back({u,v});
	if (ord[u]==3){
		checknode(u);
	}else if (ord[u]>=4){
		failnode(u);
	}
	if (failed) goto skip;
	if (ord[v]==3){
		checknode(v);
	}else if (ord[v]>=4){
		failnode(v);
	}
	if (failed) goto skip;
	if (find(u)==find(v)){
		if (cyc==-1){
			adj[u].pop_back(); adj[v].pop_back();
			dfs(u,v);
			adj[u].push_back(v); adj[v].push_back(u);
			vector<int> nw={};
			for (int i:must){
				if (incyc[i]) nw.push_back(i);
			}
			must=nw;
			if (must.empty()) failed=1;
			cyc=find(u);
			for (auto i:lz){
				if (incyc[i.first]^incyc[i.second]){
					if (incyc[i.first]){
						cn[ff(i.second)]=i.first;
					}else{
						cn[ff(i.first)]=i.second;
					}
				}
				if (incyc[i.first]||incyc[i.second]) continue;
				if (ff(i.first)!=ff(i.second)){
					merge(i.first,i.second);
				}
			}
		}else if (find(cyc)==find(u)){
			//cerr<<ff(u)<<"--"<<ff(v)<<"\n";
			if (incyc[u]||incyc[v]){
				if (incyc[u]&&incyc[v]){
					failed=1;
				}else if (incyc[u]){
					if (cn[ff(v)]==INT_MAX) failed=1;
					if (cn[ff(v)]!=-1) cn[ff(v)]=INT_MAX;
					else cn[ff(v)]=u;
				}else{
					if (cn[ff(u)]==INT_MAX) failed=1;
					if (cn[ff(u)]!=-1) cn[ff(u)]=INT_MAX;
					else cn[ff(u)]=v;
				}
			}else{
				//cerr<<cn[ff(u)]<<"uwuuwuw"<<cn[ff(v)]<<"\n";
				if (cn[ff(u)]==INT_MAX||cn[ff(v)]==INT_MAX) failed=1;
				if (cn[ff(u)]==cn[ff(v)]&&ord[cn[ff(u)]]>=4) goto here;
				if (!(hv[{cn[ff(u)],cn[ff(v)]}]||hv[{cn[ff(v)],cn[ff(u)]}])) failed=1;
				if (ff(u)==ff(v)) failed=1;
            	here:;
				merge(u,v);
			}
		}else{
			failed=1;
		}
	}else{
		par[find(u)]=v;
		if (cyc!=-1){
			if (!(incyc[u]||incyc[v])) merge(u,v);
			else{
				if (incyc[u]) swap(u,v);
				if (incyc[v]){
					cn[ff(u)]=v;
				}
			}
		}
	}
	skip:;
	//cerr<<CountCritical()<<"\n";
}
 
/*
9 11
0 1
1 2
2 3
3 4
4 5
3 6
5 0
6 7
6 4
5 8
8 7
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23764 KB Output is correct
2 Correct 15 ms 24300 KB Output is correct
3 Correct 16 ms 24440 KB Output is correct
4 Correct 14 ms 23892 KB Output is correct
5 Correct 15 ms 24372 KB Output is correct
6 Correct 16 ms 24696 KB Output is correct
7 Correct 13 ms 24016 KB Output is correct
8 Correct 17 ms 24340 KB Output is correct
9 Correct 16 ms 24520 KB Output is correct
10 Correct 17 ms 24404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 920 ms 86416 KB Output is correct
2 Correct 1737 ms 119764 KB Output is correct
3 Correct 1974 ms 128332 KB Output is correct
4 Correct 2337 ms 143464 KB Output is correct
5 Correct 2727 ms 145304 KB Output is correct
6 Correct 2663 ms 178572 KB Output is correct
7 Correct 1811 ms 125352 KB Output is correct
8 Correct 2230 ms 136084 KB Output is correct
9 Correct 2266 ms 143544 KB Output is correct
10 Correct 1701 ms 137888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23764 KB Output is correct
2 Correct 15 ms 24300 KB Output is correct
3 Correct 16 ms 24440 KB Output is correct
4 Correct 14 ms 23892 KB Output is correct
5 Correct 15 ms 24372 KB Output is correct
6 Correct 16 ms 24696 KB Output is correct
7 Correct 13 ms 24016 KB Output is correct
8 Correct 17 ms 24340 KB Output is correct
9 Correct 16 ms 24520 KB Output is correct
10 Correct 17 ms 24404 KB Output is correct
11 Incorrect 16 ms 24404 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23764 KB Output is correct
2 Correct 15 ms 24300 KB Output is correct
3 Correct 16 ms 24440 KB Output is correct
4 Correct 14 ms 23892 KB Output is correct
5 Correct 15 ms 24372 KB Output is correct
6 Correct 16 ms 24696 KB Output is correct
7 Correct 13 ms 24016 KB Output is correct
8 Correct 17 ms 24340 KB Output is correct
9 Correct 16 ms 24520 KB Output is correct
10 Correct 17 ms 24404 KB Output is correct
11 Incorrect 16 ms 24404 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23764 KB Output is correct
2 Correct 15 ms 24300 KB Output is correct
3 Correct 16 ms 24440 KB Output is correct
4 Correct 14 ms 23892 KB Output is correct
5 Correct 15 ms 24372 KB Output is correct
6 Correct 16 ms 24696 KB Output is correct
7 Correct 13 ms 24016 KB Output is correct
8 Correct 17 ms 24340 KB Output is correct
9 Correct 16 ms 24520 KB Output is correct
10 Correct 17 ms 24404 KB Output is correct
11 Correct 920 ms 86416 KB Output is correct
12 Correct 1737 ms 119764 KB Output is correct
13 Correct 1974 ms 128332 KB Output is correct
14 Correct 2337 ms 143464 KB Output is correct
15 Correct 2727 ms 145304 KB Output is correct
16 Correct 2663 ms 178572 KB Output is correct
17 Correct 1811 ms 125352 KB Output is correct
18 Correct 2230 ms 136084 KB Output is correct
19 Correct 2266 ms 143544 KB Output is correct
20 Correct 1701 ms 137888 KB Output is correct
21 Incorrect 16 ms 24404 KB Output isn't correct
22 Halted 0 ms 0 KB -