답안 #930120

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
930120 2024-02-18T15:22:21 Z Yang8on Mag (COCI16_mag) C++14
108 / 120
367 ms 166528 KB
#include <bits/stdc++.h>
#define gsn "Mag"
#define fi(i, a, b) for(int i = a; i <= b; i++)
#define fid(i, a, b) for(int i = a; i >= b; i--)
#define ll long long
#define maxn 1000005
#define gb(i, j) ((i >> j) & 1)
#define pii pair<int, int>

using namespace std;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

ll GetRandom(ll l, ll r)
{
    return uniform_int_distribution<ll> (l, r) (rng);
}

int n;
vector<int> o[maxn];
int a[maxn], dp[maxn][2], f[maxn];

void dfs(int u, int par)
{
    for(int v : o[u])
    {
        if(v == par) continue;
        dfs(v, u);

        if(a[v] == 1)
        {
            if(dp[v][0] + a[v] > dp[u][0])
            {
                dp[u][1] = dp[u][0];
                dp[u][0] = dp[v][0] + a[v];
            }
            else if(dp[v][0] + a[v] > dp[u][1])
            {
                dp[u][1] = dp[v][0] + a[v];
            }
        }
    }
}

void dfs2(int u, int par)
{
    for(int v : o[u])
    {
        if(v == par) continue;

        if(a[u] == 1)
        {
            if(f[u] + a[u] > f[v]) f[v] = f[u] + a[u];

            if(a[v] == 1)
            {
                if(dp[v][0] + a[v] == dp[u][0])
                {
                    if(dp[u][1] + a[u] > f[v]) f[v] = dp[u][1] + a[u];
                }
                else if(dp[u][0] + a[u] > f[v]) f[v] = dp[u][0] + a[u];
            }
        }

        dfs2(v, u);
    }
}

int main()
{
//    freopen(gsn".inp","r",stdin);
//    freopen(gsn".out","w",stdout);

    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    fi(i, 1, n - 1)
    {
        int x, y;
        cin >> x >> y;
        o[x].push_back(y);
        o[y].push_back(x);
    }

    fi(i, 1, n) cin >> a[i];

    dfs(1, 0);
    dfs2(1, 0);


    ll P = -1, Q = -1;
    fi(i, 1, n)
    {
        ll tu = a[i];
        ll mau = max({ dp[i][0] + dp[i][1], dp[i][0] + f[i], dp[i][1] + f[i] }) + 1;

        ll Gcd = __gcd(tu, mau);
        tu /= Gcd;
        mau /= Gcd;

        if(P == -1) P = tu, Q = mau;
        else if(P * mau > Q * tu) P = tu, Q = mau;
    }

    cout << P << "/" << Q ;

    /// ------------------check time!-----------------///
    cerr << "\n" << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 26968 KB Output is correct
2 Correct 6 ms 26972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 27224 KB Output is correct
2 Correct 7 ms 26972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 275 ms 108692 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 26972 KB Output is correct
2 Correct 349 ms 163412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 367 ms 163260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 284 ms 86272 KB Output is correct
2 Correct 208 ms 71840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 268 ms 88984 KB Output is correct
2 Correct 43 ms 32936 KB Output is correct
3 Correct 355 ms 166528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 32692 KB Output is correct
2 Correct 284 ms 86408 KB Output is correct
3 Correct 219 ms 58656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 251 ms 84560 KB Output is correct
2 Correct 283 ms 87196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 290 ms 86708 KB Output is correct
2 Correct 226 ms 58936 KB Output is correct