제출 #1330652

#제출 시각아이디문제언어결과실행 시간메모리
1330652PlayVoltzMeetings (JOI19_meetings)C++20
100 / 100
699 ms864 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back

vector<int> sz;
vector<bool> ban, done;
vector<vector<int> > graph;

void add(int a, int b){
	graph[a].pb(b);
	graph[b].pb(a);
}

void del(int a, int b){
	graph[a].erase(find(graph[a].begin(), graph[a].end(), b));
	graph[b].erase(find(graph[b].begin(), graph[b].end(), a));
}

void dfs(int node, int p){
	sz[node]=1;
	for (auto num:graph[node])if (num!=p&&!ban[num])dfs(num, node), sz[node]+=sz[num];
}

int find_centroid(int node, int p, int size){
	for (auto num:graph[node])if (num!=p&&!ban[num]&&sz[num]>size/2)return find_centroid(num, node, size);
	return node;
}

bool custom(int a, int b){
	return sz[a]>sz[b];
}

void insert(int node, int v){
	dfs(node, -1);
	if (sz[node]==1){
		add(node, v);
		return;
	}
	if (sz[node]==2){
		int a;
		for (auto num:graph[node])if (!ban[num])a=num;
		int res=Query(node, a, v);
		if (res==a||res==node){
			add(res, v);
			done[v]=1;
			return;
		}
		else{
			del(node, a);
			add(node, res);
			add(a, res);
			if (res!=v)add(res, v);
			done[v]=done[res]=1;
			return;
		}
	}
	int c=find_centroid(node, -1, sz[node]);
	dfs(c, -1);
	vector<int> vect;
	for (auto num:graph[c])if (!ban[num])vect.pb(num);
	sort(vect.begin(), vect.end(), custom);
	for (int i=0; i<vect.size(); i+=2){
		if (i==vect.size()-1){
			insert(vect[i], v);
			return;
		}
		int res=Query(vect[i], vect[i+1], v);
		if (res==vect[i]||res==vect[i+1]){
			ban[c]=1;
			insert(res, v);
			return;
		}
		else if (res==c)ban[vect[i]]=ban[vect[i+1]]=1;
		else{
			int a=(Query(vect[i], c, v)==c?vect[i+1]:vect[i]);
			del(c, a);
			add(c, res);
			add(a, res);
			if (res!=v)add(res, v);
			done[v]=done[res]=1;
			return;
		}
	}
	add(c, v);
}

void Solve(int n){
	graph.resize(n);
	sz.resize(n);
	done.resize(n, 0);
	done[0]=done[1]=1;
	add(0, 1);
	for (int i=0; i<n; ++i)if (!done[i])ban.assign(n, 0), insert(0, i);
	for (int i=0; i<n; ++i)for (auto num:graph[i])if (num<i)Bridge(num, i);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...