1 条题解

  • 3
    @ 2023-7-26 15:59:30

    image image

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=200005;
    int n,m,k,s,t,sz[N],ans=0x3f3f3f3f;
    multiset<int> s1,s2;
    multiset<int>::iterator it;
    vector<int> e[N];
    void check(int a,int b){
    	int c=n-a-b;
    	int p=max(max(a,b),c);
    	int q=min(min(a,b),c);
    	ans=min(ans,p-q);
    }
    void dfs(int u,int fa){
    	sz[u]=1;
    	for (int &v:e[u]){
    		if (v==fa) continue;
    		dfs(v,u);
    		sz[u]+=sz[v];
    	}
    }
    void dfs1(int u,int fa){
    	it=s1.lower_bound((n-sz[u])/2);
    	if (it!=s1.end()) check(sz[u],*it);
    	if (it!=s1.begin()) {
    		--it;
    		check(sz[u],*it);
    	}
    	it=s2.lower_bound((n+sz[u])/2);
    	if (it!=s2.end()) check(sz[u],*it-sz[u]);
    	if (it!=s2.end()) {
    		--it;
    		check(sz[u],*it-sz[u]);
    	}
    	s2.insert(sz[u]);
    	for (int &v:e[u]){
    		if (v==fa) continue;
    		dfs1(v,u);
     	}
    	s2.erase(s2.find(sz[u]));
    	s1.insert(sz[u]);
    }
    int main(){
    	freopen("in.txt","r",stdin);
    	cin>>n;
    	for (int i=1;i<n;++i){
    		cin>>s>>t;
    		e[s].push_back(t);
    		e[t].push_back(s);
    	}
    	dfs(1,0);
    	dfs1(1,0);
    	cout<<ans;
    }
    
    
    
    • 1

    信息

    ID
    342
    时间
    1000ms
    内存
    500MiB
    难度
    5
    标签
    递交数
    60
    已通过
    23
    上传者