64842023-12-04 21:29:13szilHosszú Láncokcpp17Elfogadva 100/100116ms16932 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int n;
vector<vector<int>> v;

int dfs(int x, int m, int p = -1){
    map<int, int> c;
    int nagyobb = 0, total = 0;
    for(int i : v[x]){
        if(i == p)continue;
        int t = dfs(i, m, x);
        if(t == -1)return -1;
        if(t >= m)nagyobb++;
        else {
            c[t]++; total++;
        }
    }
    if(c.empty()){
        if(nagyobb)return m+1;
        else return 1;
    }
    auto it = c.begin();
    int nemsik = -1;
    while(it != c.end() && total >= 2){
        auto it2 = c.lower_bound(m-it->first);
        if(it == it2 && it->second == 1) it2++;
        if(it2 == c.end()){
            if(nagyobb){
                it->second--; total--;
                if (it->second == 0)
                    it = c.erase(it);
                nagyobb--;
                continue;
            } else {
                if(nemsik != -1)
                    return -1;
                if(it->second > 1){
                    return -1;
                }
                nemsik = it->first;
                it++;
                continue;
            }
        }
        it->second--; total--;
        if (it->second == 0)
            it = c.erase(it);
        
        if(it == it2 && it->second == 1) {
            it = c.erase(it); total--;
        } else {
            it2->second--; total--;
            if (it2->second == 0) {
                it2 = c.erase(it2);
            }
            
        }
    }

    if(total == 0){
        if(nagyobb)return m+1;
        return 1;
    }
    if(nagyobb >= 2)return m+1;
    return c.begin()->first+1;
}

void solve(){
    cin>>n;
    v.assign(n, {});
    for(int i = 0; i < n-1; i++){
        int a, b; cin>>a>>b; a--; b--;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    int start = 0;
    for(int i = 0; i < n; i++){
        if(v[i].size() == 1) {
            start = i;
            break;
        }
    }

    int l = 1, r = n-1;
    while(l < r){
        int m = (l+r+1)/2;
        int res = dfs(start, m);
        if(res > m || res == 1){
            l = m;
        } else {
            r = m-1;
        }
    }
    cout<<l<<endl;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int _t = 1;
    // cin >> _t;
    while (_t--) {
        solve();
    }
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2104 KiB
2Elfogadva3ms2064 KiB
3Elfogadva3ms2300 KiB
4Elfogadva3ms2488 KiB
subtask210/10
5Elfogadva3ms2584 KiB
6Elfogadva3ms2696 KiB
7Elfogadva3ms2784 KiB
8Elfogadva3ms2908 KiB
9Elfogadva3ms3000 KiB
10Elfogadva3ms3088 KiB
11Elfogadva3ms2992 KiB
12Elfogadva3ms3276 KiB
13Elfogadva3ms3268 KiB
14Elfogadva3ms3456 KiB
15Elfogadva3ms3552 KiB
subtask320/20
16Elfogadva3ms3768 KiB
17Elfogadva3ms3976 KiB
18Elfogadva3ms4060 KiB
19Elfogadva3ms4288 KiB
20Elfogadva2ms4340 KiB
21Elfogadva3ms4244 KiB
22Elfogadva3ms4260 KiB
23Elfogadva3ms4364 KiB
subtask420/20
24Elfogadva3ms4260 KiB
25Elfogadva3ms4364 KiB
26Elfogadva3ms4544 KiB
27Elfogadva3ms4524 KiB
28Elfogadva3ms4476 KiB
29Elfogadva3ms4492 KiB
30Elfogadva3ms4792 KiB
31Elfogadva3ms4948 KiB
subtask550/50
32Elfogadva7ms5720 KiB
33Elfogadva12ms7152 KiB
34Elfogadva26ms10400 KiB
35Elfogadva54ms15960 KiB
36Elfogadva8ms6080 KiB
37Elfogadva18ms7248 KiB
38Elfogadva45ms11148 KiB
39Elfogadva116ms16932 KiB