Submission #358371

# Submission time Handle Problem Language Result Execution time Memory
358371 2021-01-25T11:51:29 Z egekabas Papričice (COCI20_papricice) C++14
110 / 110
471 ms 32940 KB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pll;
typedef pair<ull, ull> pull;
typedef pair<int, int> pii;
typedef pair<ld, ld> pld;
int n;
int calcval(int a, int b){
    int c = n-a-b;
    return max({abs(a-b), abs(a-c), abs(b-c)});
}
int ans = 1e9;
 
vector<int> g[200009];
multiset<int> s, ins;
int sz[200009];
int uptop = 0;
void dfs1(int v, int prt){
    sz[v] = 1;

    for(auto u : g[v])
        if(u != prt){
            dfs1(u, v);
            sz[v] += sz[u];
        }
    s.insert(sz[v]);
}
void calc(int x, multiset<int> &s){
    int opt = (n-x)/2;
    auto it = s.lower_bound(opt);
    if(it != s.end()){
        ans = min(ans, calcval(x, *it));
    }
    if(it != s.begin()){
        --it;
        ans = min(ans, calcval(x, *it));
    }
}

void dfs2(int v, int prt, int del){
    s.erase(s.lower_bound(sz[v]));

    pii maxi = {0, 0};
    for(auto u : g[v])
        if(u != prt)
            maxi = max(maxi, {sz[u], u});
    
    for(auto u : g[v])
        if(u != prt && u != maxi.ss)
            dfs2(u, v, 0);
    if(maxi.ss){
        dfs2(maxi.ss, v, 1);
    }
    
    calc(sz[v], s);
    calc(n-sz[v], ins);

    ins.insert(sz[v]);    
    if(del == 0){
        for(auto u : ins)
            s.insert(u);
        ins.clear();
    }
}
    
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    cin >> n;
    for(int i = 0; i < n-1; ++i){
        int x, y;
        cin >> x >> y;
        g[x].pb(y);
        g[y].pb(x);
    }
    
    dfs1(1, 0);
    dfs2(1, 0, 0);
    cout << ans << '\n';
    //cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 5100 KB Output is correct
2 Correct 4 ms 5100 KB Output is correct
3 Correct 4 ms 5100 KB Output is correct
4 Correct 4 ms 5100 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 5100 KB Output is correct
2 Correct 4 ms 5100 KB Output is correct
3 Correct 4 ms 5100 KB Output is correct
4 Correct 4 ms 5100 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 7 ms 5376 KB Output is correct
7 Correct 6 ms 5228 KB Output is correct
8 Correct 5 ms 5228 KB Output is correct
9 Correct 6 ms 5228 KB Output is correct
10 Correct 5 ms 5228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 5100 KB Output is correct
2 Correct 4 ms 5100 KB Output is correct
3 Correct 4 ms 5100 KB Output is correct
4 Correct 4 ms 5100 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 7 ms 5376 KB Output is correct
7 Correct 6 ms 5228 KB Output is correct
8 Correct 5 ms 5228 KB Output is correct
9 Correct 6 ms 5228 KB Output is correct
10 Correct 5 ms 5228 KB Output is correct
11 Correct 414 ms 21868 KB Output is correct
12 Correct 471 ms 24172 KB Output is correct
13 Correct 348 ms 24684 KB Output is correct
14 Correct 383 ms 24344 KB Output is correct
15 Correct 454 ms 24044 KB Output is correct
16 Correct 274 ms 24040 KB Output is correct
17 Correct 406 ms 24300 KB Output is correct
18 Correct 362 ms 32940 KB Output is correct
19 Correct 382 ms 24300 KB Output is correct
20 Correct 428 ms 24172 KB Output is correct