Submission #1296405

#TimeUsernameProblemLanguageResultExecution timeMemory
1296405PieArmyThe Ties That Guide Us (CEOI23_incursion)C++20
100 / 100
164 ms6912 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
#include"incursion.h"

int n;
int par[45023],sub[45023];
pair<int,int>cent;
vector<int>komsu[45023];
int tur[45023];

void dfs(int pos,int las){
	sub[pos]=1;
	for(int x:komsu[pos]){
		if(x==las)continue;
		dfs(x,pos);
		sub[pos]+=sub[x];
	}
}

void dfs(int pos){
	for(int x:komsu[pos]){
		if(x==par[pos])continue;
		par[x]=pos;
		dfs(x);
	}
}

vector<int> mark(vector<pair<int,int>>F,int safe){
	n=F.size()+1;
	for(auto&x:F){
		komsu[x.fr].pb(x.sc);
		komsu[x.sc].pb(x.fr);
	}
	dfs(1,1);
	cent.fr=1;
	while(true){
		int nex=-1;
		for(int x:komsu[cent.fr]){
			if(sub[x]>sub[cent.fr])continue;
			if(sub[x]*2>n){
				nex=x;
				break;
			}
			if(sub[x]*2==n){
				cent.sc=x;
				break;
			}
		}
		if(nex==-1)break;
		cent.fr=nex;
	}
	par[cent.fr]=cent.sc;
	par[cent.sc]=cent.fr;
	dfs(cent.fr);
	if(cent.sc)dfs(cent.sc);
	vector<int>ans(n);
	for(int i=0;i<n;i++){
		ans[i]=1;
	}
	int pos=safe;
	while(pos!=cent.fr&&pos!=cent.sc){
		ans[pos-1]=0;
		pos=par[pos];
	}
	ans[pos-1]=0;
	return ans;
}

void locate(vector<pair<int,int>>F,int curr,int t){
	n=F.size()+1;
	for(int i=1;i<=n;i++){
		komsu[i].clear();
		par[i]=0;
		cent={0,0};
	}
	for(auto&x:F){
		komsu[x.fr].pb(x.sc);
		komsu[x.sc].pb(x.fr);
	}
	dfs(1,1);
	cent.fr=1;
	while(true){
		int nex=-1;
		for(int x:komsu[cent.fr]){
			if(sub[x]>sub[cent.fr])continue;
			if(sub[x]*2>n){
				nex=x;
				break;
			}
			if(sub[x]*2==n){
				cent.sc=x;
				break;
			}
		}
		if(nex==-1)break;
		cent.fr=nex;
	}
	par[cent.fr]=cent.sc;
	par[cent.sc]=cent.fr;
	dfs(cent.fr);
	if(cent.sc)dfs(cent.sc);
	int x=t;
	int pos=curr;
	for(int i=1;i<=n;i++){
		tur[i]=-1;
	}
	while(x){
		tur[pos]=1;
		x=visit(par[pos]);
		pos=par[pos];
	}
	tur[pos]=0;
	dfs(pos,pos);
	while(true){
		if(tur[pos]==1){
			visit(par[pos]);
			pos=par[pos];
			continue;
		}
		int nex=-1;
		for(int x:komsu[pos]){
			if(tur[x]!=-1)continue;
			if(x==par[pos])continue;
			if(nex==-1||sub[x]>sub[nex])nex=x;
		}
		if(nex==-1)return;
		tur[nex]=visit(nex);
		pos=nex;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...