제출 #147069

#제출 시각아이디문제언어결과실행 시간메모리
147069dennisstarSplit the Attractions (IOI19_split)C++17
100 / 100
248 ms29044 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vim;
vim V[100010], W[100010];
vim C[100010], par;
int chk[100010];
pair<int,int> pi[3];
int N, Ctd;
vim ans;
int chkans[100010];
void mst(int lev)
{
	chk[lev]=1;
	for (int i:V[lev]) {
		if (!chk[i]) {
			par[i]=lev;
			C[lev].push_back(i);
			mst(i);
		}
	}
}
int cent(int lev)
{
	vector<int> Cs;
	for (int i:C[lev]) {
		Cs.push_back(cent(i));
	}
	int ret=0, flag=0;
	for (int i:Cs) {
		ret+=i;
		if (i>N/2) flag=1;
	}
	if (N-ret-1>N/2) flag=1;
	if (!flag) Ctd=lev;
	return ret+1;
}
void dfs(int lev) 
{
	chk[lev]=1;
	for (int i:C[lev]) {
		if (!chk[i]) {
			W[lev].push_back(i);
			W[i].push_back(lev);
			dfs(i);
		}
	}
	if (!chk[par[lev]]) {
		W[lev].push_back(par[lev]);
		W[par[lev]].push_back(lev);
		dfs(par[lev]);
	}
}
int gC(int lev){
	chk[lev]=1;
	int ret=0;
	for (int i:W[lev]) {
		if (!chk[i]) ret+=gC(i);
	}
	return ret+1;
}
void GA1(int st, int sw)
{
	if (sw==0) {
		if (!pi[0].first) return ;
		chk[st]=1;
		chkans[st]=pi[0].second+1;
		pi[0].first--;
		for (int i:W[st]) {
			if (!chk[i]) {
				GA1(i, sw);
			}
		}
	}
	if (sw==1) {
		if (!pi[1].first) return ;
		chk[st]=1;
		chkans[st]=pi[1].second+1;
		pi[1].first--;
		for (int i:W[st]) {
			if (!chk[i]) {
				GA1(i, sw);
			}
		}
	}
	if (sw==2) {
		for (int i=0; i<N; i++) if (!chkans[i]) chkans[i]=pi[2].second+1;
		for (int i=0; i<N; i++) ans.push_back(chkans[i]);
	}
}
int dfs1(int lev)
{
	chk[lev]=1;
	int ret=1;
	for (int i:V[lev]) {
		if (!chk[i]) {
			ret+=dfs1(i);
		}
	}
	return ret;
}
void dfs2(int lev)
{
	if (!pi[0].first) return ;
	chk[lev]=1;
	chkans[lev]=pi[0].second;
	pi[0].first--;
	for (int i:V[lev]) {
		if (!chk[i]&&i!=Ctd) dfs2(i);
	}
}
void dfs3(int lev)
{
	if (!pi[1].first) return ;
	chk[lev]=1;
	chkans[lev]=pi[1].second;
	pi[1].first--;
	for (int i:V[lev]) {
		if (!chk[i]) dfs3(i);
	}
}
void dfs4()
{
	int i, j=0;
	for (i=0; i<N; i++) {if (!chk[i]) {chkans[i]=pi[2].second; j++;}}
	for (i=0; i<N; i++) ans.push_back(chkans[i]+1);
	if (j!=pi[2].first) {
		printf("%d", 1/0);
	}
}
int GA2()
{
	int i, ret, fl=0;
	memset(chk, 0, sizeof(chk));
	chk[Ctd]=1;
	for (i=0; i<N; i++) {
		if (i!=Ctd&&!chk[i]) {
			ret=dfs1(i);
			if (ret>=pi[0].first) {
				memset(chk, 0, sizeof(chk));
				dfs2(i);
				dfs3(Ctd);
				dfs4();
				fl=1;
				break;
			}
		}
	}
	if (!fl) return -1;
	return 0;
}
vim IMPOSSIBLE()
{
	vim ret;
	for (int i=0; i<N; i++) ret.push_back(0);
	//if (ret.size()!=N) assert(false);
	return ret;
}

vim find_split(int n, int a, int b, int c, vim p, vim q) {
	N=n;
	par.resize(n);
	pi[0]={a,0}; pi[1]={b,1}; pi[2]={c,2};
	sort(pi,pi+3);
	int i;
	for (i=0; i<p.size(); i++) {
		V[p[i]].push_back(q[i]);
		V[q[i]].push_back(p[i]);
	}
	mst(0);
	cent(0);
	memset(chk, 0, sizeof(chk));
	dfs(Ctd);
	memset(chk, 0, sizeof(chk));
	chk[Ctd]=1;
	vim CtdV;
	for (int j:W[Ctd]) CtdV.push_back(gC(j));
	memset(chk, 0, sizeof(chk));
	chk[Ctd]=1;
	for (i=0; i<CtdV.size(); i++) {
		if (CtdV[i]>=pi[0].first){
			GA1(W[Ctd][i], 0);
			GA1(Ctd, 1);
			GA1(0, 2);
			if (ans.size()!=N) assert(false);
			return ans;
		}
	}
	if (GA2()==-1) {
		return IMPOSSIBLE();
	}
	else {
		//if (ans.size()!=N) assert(false);
		return ans;
	}
}

컴파일 시 표준 에러 (stderr) 메시지

split.cpp: In function 'void dfs4()':
split.cpp:128:17: warning: division by zero [-Wdiv-by-zero]
   printf("%d", 1/0);
                ~^~
split.cpp: In function 'vim find_split(int, int, int, int, vim, vim)':
split.cpp:166:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i=0; i<p.size(); i++) {
            ~^~~~~~~~~
split.cpp:180:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i=0; i<CtdV.size(); i++) {
            ~^~~~~~~~~~~~
split.cpp:185:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (ans.size()!=N) assert(false);
        ~~~~~~~~~~^~~
#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...