Submission #1223334

#TimeUsernameProblemLanguageResultExecution timeMemory
1223334_rain_Papričice (COCI20_papricice)C++20
110 / 110
120 ms37436 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)2e5;
	vector<int>ke[N+2];
	int sub[N+2],n,ans=(int)1e9+7;
	bool ban[N+2]={};
	
	int minimize(int &x,int y){
		if (x>y) x=y,true;
		return false;
	}
	
	void add_canh(int u,int v){
		ke[u].push_back(v) , ke[v].push_back(u);
		return;
	}
	
	set<int>sett[N+2];
	pair<int,int> binary(set<int>&sett,int x){
		pair<int,int>ans={-1,-1};
		auto it=sett.lower_bound(x);
		if (it!=sett.end()) ans.first=*it;
		if (it!=sett.begin()){
			--it;
			ans.second=*it;
		}
		return ans;
	}
	
	void dfs(int u,int p){
		sub[u]=1;
		for(auto&v:ke[u]){
			if (v==p) continue;
			dfs(v,u);
			sub[u]+=sub[v];
			
			if (sett[u].size()<sett[v].size())
				swap(sett[u],sett[v]);
				
			for(auto&sz:sett[v]) {
				pair<int,int> pont=binary(sett[u],(n-sz)/2);
				if (pont.first!=-1) {
					int add_more=max({sz,n-sz-pont.first,pont.first})-min({sz,n-sz-pont.first,pont.first});
					ans=min(ans,add_more);	
				}	
				if (pont.second!=-1){
					int add_more=max({sz,n-sz-pont.second,pont.second})-min({sz,n-sz-pont.second,pont.second});	
					ans=min(ans,add_more);
				}
			}
			for(auto&sz:sett[v]) sett[u].insert(sz);
		}
		
		if (sett[u].size()){
			pair<int,int>pont=binary(sett[u],sub[u]/2);
			if (pont.first!=-1) {
				int sz=sub[u]-pont.first;
				int add_more=max({sz,n-sz-pont.first,pont.first})-min({sz,n-sz-pont.first,pont.first});
				ans=min(ans,add_more);	
			}
			if (pont.second!=-1){
				int sz=sub[u]-pont.second;
				int add_more=max({sz,n-sz-pont.second,pont.second})-min({sz,n-sz-pont.second,pont.second});	
				ans=min(ans,add_more);
			}
		}
		sett[u].insert(sub[u]);
		return;
	}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	#define task "main"
	if (fopen(task".inp","r")){
		freopen(task".inp","r",stdin);
		freopen(task".out","w",stdout);
	}
	
	cin>>n;
	for(int i=1;i<n;++i){
		int u,v; cin>>u>>v;
		add_canh(u,v);
	}
	dfs(1,0);
	cout<<ans;
	return 0;
}

Compilation message (stderr)

papricice.cpp: In function 'int main()':
papricice.cpp:78:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
papricice.cpp:79:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...