Submission #701601

# Submission time Handle Problem Language Result Execution time Memory
701601 2023-02-21T14:53:04 Z tamthegod Mag (COCI16_mag) C++17
96 / 120
455 ms 262144 KB
// Make the best become better
// No room for laziness
#include<bits/stdc++.h>

#define int long long
#define pb push_back
#define fi first
#define se second
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 1e6 + 5;
const int mod = 1e9 + 7;
const ll oo = 1e18;
int n;
int a[maxN];
vector<int> adj[maxN];
int f[maxN][2];
int res0 = 0, res1 = 0;
void ReadInput()
{
    cin >> n;
    for(int i=1; i<n; i++)
    {
        int u, v;
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for(int i=1; i<=n; i++)
        cin >> a[i];
}
void dfs(int u, int par)
{
    if(u != 1 && adj[u].size() == 1)
    {
        if(a[u] == 1)
        {
            f[u][0] = 1;
            f[u][1] = 1;
            res0 = max(res0, f[u][0]);
        }
        return;
    }
    for(int v : adj[u])
    {
        if(v == par) continue;
        dfs(v, u);
    }
    vector<pair<int, int>> vc0, vc1;
    for(int v : adj[u])
    {
        if(v == par) continue;
        if(a[u] == 1)
        {
            f[u][0] = max(f[u][0], f[v][0] + 1);
            f[u][1] = max(f[u][1], f[v][1] + 1);
        }
        if(a[u] == 2)
            f[u][1] = max(f[u][1], f[v][0]);
        vc0.pb({f[v][0], v});
        vc1.pb({f[v][1], v});
    }
    sort(vc0.begin(), vc0.end(), greater<pair<int, int>>());
    res0 = max(res0, f[u][0]);
    res1 = max(res1, f[u][1]);
    if(a[u] == 2 && vc0.size() > 1) res1 = max(res1, vc0[0].fi + vc0[1].fi);
    if(a[u] == 1 && vc0.size() > 1) res0 = max(res0, vc0[0].fi + vc0[1].fi + 1);
    if(a[u] == 1)
    {
        if(vc0[0].se != vc1[0].se) res1 = max(res1, vc0[0].fi + vc1[0].fi + 1);
        else
        {
            if(vc1.size() > 1) res1 = max(res1, vc0[0].fi + vc1[1].fi + 1);
            if(vc0.size() > 1) res1 = max(res1, vc0[1].fi + vc1[0].fi + 1);
        }

    }
}
void Solve()
{
    int val = *min_element(a + 1, a + n + 1);
    if(val > 1)
    {
        cout << val << '/' << 1;
        return;
    }
    dfs(1, 0);
   // cout << f[5][1];return;
    pair<int, int> p = {2, res1 + 1}, q = {1, res0};
    if(p.fi * q.se > q.fi * p.se) p = q;
    int t = __gcd(p.fi, p.se);
    p.fi /= t;
    p.se /= t;
    cout << p.fi << "/" << p.se;
}
int32_t main()
{
    //freopen("sol.inp", "r", stdin);
    //freopen("sol.out", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ReadInput();
    Solve();
}
# Verdict Execution time Memory Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 12 ms 23856 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 23780 KB Output is correct
2 Correct 12 ms 23892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 356 ms 142720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 23892 KB Output is correct
2 Runtime error 442 ms 262144 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 450 ms 262144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 360 ms 78348 KB Output is correct
2 Correct 297 ms 64464 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 335 ms 93040 KB Output is correct
2 Correct 60 ms 29876 KB Output is correct
3 Runtime error 455 ms 262144 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 67 ms 29816 KB Output is correct
2 Correct 401 ms 79804 KB Output is correct
3 Correct 274 ms 54224 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 363 ms 80236 KB Output is correct
2 Correct 361 ms 78108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 376 ms 79680 KB Output is correct
2 Correct 300 ms 61860 KB Output is correct