Submission #1223344

#TimeUsernameProblemLanguageResultExecution timeMemory
1223344_rain_Papričice (COCI20_papricice)C++20
110 / 110
159 ms19260 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>A,B;
	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 pre_dfs(int u,int p){
		sub[u]=1;
		for(auto&v:ke[u]){
			if (v==p) continue;
			pre_dfs(v,u) , sub[u]+=sub[v];
		}
		return;
	}
	
	void dfs(int u,int p){
		
		if (A.size()){
			pair<int,int> pont=binary(A,(n+sub[u])/2);
			if (pont.first!=-1) {
				int sz=pont.first-sub[u];
				int add_more=max({sz,n-sz-sub[u],sub[u]})-min({sz,n-sz-sub[u],sub[u]});
				ans=min(ans,add_more);	
			}
			if (pont.second!=-1){
				int sz=pont.second-sub[u];
				int add_more=max({sz,n-sz-sub[u],sub[u]})-min({sz,n-sz-sub[u],sub[u]});	
				ans=min(ans,add_more);
			}
		}
		if (B.size()){
			pair<int,int> pont=binary(B,(n-sub[u])/2);
			int sz=sub[u];
			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);
				}
		}
		
		A.insert(sub[u]);
		for(auto&v:ke[u]){
			if (v==p) continue;
			dfs(v,u);
		}
		A.erase(sub[u]) , B.insert(sub[u]);
		
	}

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);
	}
	pre_dfs(1,0);
	dfs(1,0);
	cout<<ans;
	return 0;
}

Compilation message (stderr)

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