Submission #701602

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

#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<ll, ll> p = {2, res1 + 1}, q = {1, res0};
    if(p.fi * q.se > q.fi * p.se) p = q;
    ll 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 13 ms 23764 KB Output is correct
2 Correct 14 ms 23764 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 23756 KB Output is correct
2 Correct 12 ms 23892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 343 ms 133388 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 23756 KB Output is correct
2 Correct 456 ms 262144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 453 ms 259468 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 342 ms 66720 KB Output is correct
2 Correct 254 ms 55668 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 337 ms 76316 KB Output is correct
2 Correct 57 ms 28128 KB Output is correct
3 Correct 491 ms 262144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 57 ms 28232 KB Output is correct
2 Correct 333 ms 68268 KB Output is correct
3 Correct 265 ms 45988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 311 ms 68392 KB Output is correct
2 Correct 333 ms 66212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 348 ms 67968 KB Output is correct
2 Correct 262 ms 46004 KB Output is correct