Submission #445818

#TimeUsernameProblemLanguageResultExecution timeMemory
445818JasiekstrzPapričice (COCI20_papricice)C++17
110 / 110
250 ms38720 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=2e5;
set<int> stmem[N+10];
set<int>* st[N+10];
vector<int> e[N+10];
int siz[N+10];
int f(int a,int b,int c)
{
	vector<int> tmp={a,b,c};
	sort(tmp.begin(),tmp.end());
	return tmp[2]-tmp[0];
}
int dfs(int x,int p,int n)
{
	int ans=n;
	siz[x]=1;
	st[x]=&stmem[x];
	for(auto v:e[x])
	{
		if(v==p)
			continue;
		ans=min(ans,dfs(v,x,n));
		siz[x]+=siz[v];
		if(st[x]->size()<st[v]->size())
			swap(st[x],st[v]);
		for(auto c:*st[v])
		{
			auto it=st[x]->lower_bound((n-c+1)/2);
			if(it!=st[x]->end())
				ans=min(ans,f(c,*it,n-*it-c));
			if(it!=st[x]->begin())
				ans=min(ans,f(c,*prev(it),n-*prev(it)-c));
		}
		for(auto c:*st[v])
			st[x]->insert(c);
		{set<int> ().swap(*st[v]);}
	}
	if(x!=1)
	{
		auto it=st[x]->lower_bound((siz[x]+1)/2);
		if(it!=st[x]->end())
			ans=min(ans,f(n-siz[x],*it,siz[x]-*it));
		if(it!=st[x]->begin())
			ans=min(ans,f(n-siz[x],*prev(it),siz[x]-*prev(it)));
	}
	st[x]->insert(siz[x]);
	return ans;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n;
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int a,b;
		cin>>a>>b;
		e[a].push_back(b);
		e[b].push_back(a);
	}
	cout<<dfs(1,0,n)<<"\n";
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...