Submission #98344

# Submission time Handle Problem Language Result Execution time Memory
98344 2019-02-22T17:16:49 Z dalgerok Mag (COCI16_mag) C++17
120 / 120
823 ms 241116 KB
#include<bits/stdc++.h>
using namespace std;


const int N = 1e6 + 5;


int n, a[N], dp_down[N], dp_up[N];
int ans1 = -1, ans2 = -1;
vector < int > g[N];

inline void upd(int &x, int y){
    if(x < y){
        x = y;
    }
}

inline void check(int x, int y){
    /// x / y < ans1 / ans2;
    /// x * ans2 < ans1 * y;
    if(ans1 == -1){
        ans1 = x;
        ans2 = y;
    }
    else if(1LL * x * ans2 < 1LL * ans1 * y){
        ans1 = x;
        ans2 = y;
    }
}

void dfs1(int v, int pr = -1){
    for(int to : g[v]){
        if(to != pr){
            dfs1(to, v);
            upd(dp_down[v], (a[to] == 1 ? dp_down[to] + 1 : 0));
        }
    }
}

void dfs2(int v, int pr = -1){
    if(pr != -1){
        g[v].erase(find(g[v].begin(), g[v].end(), pr));
    }
    int sz = (int)g[v].size();
    vector < int > pref(sz + 2), suf(sz + 2);
    for(int i = 1; i <= sz; i++){
        int to = g[v][i - 1];
        pref[i] = max(pref[i - 1], (a[to] == 1 ? dp_down[to] + 1 : 0));
    }
    for(int i = sz; i >= 1; i--){
        int to = g[v][i - 1];
        suf[i] = max(suf[i + 1], (a[to] == 1 ? dp_down[to] + 1 : 0));
    }
    int mx = dp_up[v];
    for(int i = 1; i <= sz; i++){
        int to = g[v][i - 1];
        if(a[v] == 1){
            dp_up[to] = max({pref[i - 1], suf[i + 1], dp_up[v]}) + 1;
        }
        else{
            dp_up[to] = 0;
        }
        int val = (a[to] == 1 ? dp_down[to] + 1 : 0);
        int x = a[v], y = 1 + mx + val;
        check(x, y);
        mx = max(mx, val);
        dfs2(to, v);
    }
}


int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n;
    for(int i = 1; i < n; i++){
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    dfs1(1);
    dfs2(1);
    int g = __gcd(ans1, ans2);
    cout << ans1 / g << "/" << ans2 / g;
}
# Verdict Execution time Memory Grader output
1 Correct 28 ms 23932 KB Output is correct
2 Correct 26 ms 23936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 23936 KB Output is correct
2 Correct 25 ms 23928 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 526 ms 120976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 23936 KB Output is correct
2 Correct 776 ms 237324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 706 ms 218576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 699 ms 66816 KB Output is correct
2 Correct 512 ms 66952 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 631 ms 70528 KB Output is correct
2 Correct 181 ms 30044 KB Output is correct
3 Correct 823 ms 241116 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 185 ms 28280 KB Output is correct
2 Correct 660 ms 68088 KB Output is correct
3 Correct 728 ms 53720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 647 ms 66360 KB Output is correct
2 Correct 590 ms 66316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 720 ms 67872 KB Output is correct
2 Correct 637 ms 46024 KB Output is correct