QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#834794#9530. A Game On TreeKopicyWA 3ms3836kbC++234.5kb2024-12-27 23:57:122024-12-27 23:57:13

Judging History

This is the latest submission verdict.

  • [2024-12-27 23:57:13]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 3836kb
  • [2024-12-27 23:57:12]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define per(i, a, b) for(int i=(a);i>=(b);--i)
#define IOS std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vv vector
#define sz(x) (int)x.size()
#define endl "\n"
const int inf = 1e18, N = 3e5 + 5, mod = 998244353, m1 = 1;

int qpw(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int inv(int x) { return qpw(x, mod - 2); }

void solve() {
    int n;
    cin >> n;
    vv<vv<int>> g(n + 1);
    rep(i, 1, n - 1) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    vv<int> siz(n + 1), maxs(n + 1), del(n + 1);
    vv<int> dist(n + 1), siz2(n + 1), val(n + 1);
    int ans = 0;
    auto sol = [&](auto &&self, int u, int s) -> void {
        int ms = s + 1, rt = -1;
        auto dfs1 = [&](auto &&self, int u, int pr) -> void {
            siz[u] = 1;
            maxs[u] = 0;

            dist[u] = 0;
            siz2[u] = 0;
            val[u] = 0;
            for (int v: g[u]) {
                if (del[v] || v == pr) continue;
                self(self, v, u);
                siz[u] += siz[v];
                maxs[u] = max(maxs[u], siz[v]);
            }
            maxs[u] = max(maxs[u], s - maxs[u]);
            if (maxs[u] < ms) ms = maxs[u], rt = u;
        };
        dfs1(dfs1, u, 0);

        int sum1 = 0, sum2 = 0, sum3 = 0;
        int totSiz = 1, Siz2 = 0;
        for (int v: g[rt]) {
            if (del[v]) continue;
            auto dfs = [&](auto &&self, int u, int pr) -> void {
                dist[u] = dist[pr] + 1;
                siz2[u] = 1;
                siz[u] = 1;
                for (int v: g[u]) {
                    if (v == pr || del[v]) continue;
                    self(self, v, u);
                    siz2[u] += siz2[v];
                    siz[u] += siz[v];
                }
            };
            dfs(dfs, v, rt);
            (Siz2 += siz2[v] * siz2[v] % mod) %= mod;
            (totSiz += siz2[v]);
            auto dfs2 = [&](auto &&self, int u, int pr) -> void {
                val[u] = siz2[u] * siz2[u] % mod;
                for (int v: g[u]) {
                    if (v == pr || del[v]) continue;
                    self(self, v, u);
                    val[u] = (val[u] - siz2[v] * siz2[v] % mod + mod) % mod;
                }
            };
            dfs2(dfs2, v, rt);

            auto dfs3 = [&](auto &&self, int u, int pr) -> void {
                ans += sum1 * dist[u] * dist[u] % mod * val[u] % mod;
                ans %= mod;
                ans += sum2 * val[u] % mod;
                ans %= mod;
                ans += dist[u] * val[u] % mod * sum3 % mod;
                ans %= mod;
                for (int v: g[u]) {
                    if (v == pr || del[v]) continue;
                    self(self, v, u);
                }
            };
            dfs3(dfs3, v, rt);
            auto dfs4 = [&](auto &&self, int u, int pr) -> void {
                (sum1 += val[u]) %= mod;
                (sum2 += dist[u] * dist[u] % mod * val[u] % mod) %= mod;
                (sum3 += dist[u] * val[u] % mod * 2 % mod) %= mod;
                for (int v: g[u]) {
                    if (v == pr || del[v]) continue;
                    self(self, v, u);
                }
            };
            dfs4(dfs4, v, rt);
        }
        int out=n-totSiz;
        totSiz=n;(Siz2+=out*out%mod)%=mod;
        for (int v: g[rt]) {
            if (del[v]) continue;
            int totSiz2 = totSiz - siz2[v], siz22 = (Siz2 - siz2[v] * siz2[v] % mod + mod) % mod;
            int ret = (totSiz2 * totSiz2 % mod - siz22 + mod) % mod;
            auto dfs = [&](auto &&self, int u, int pr) -> void {
                ans = (ans + ret * dist[u] % mod * dist[u] % mod * val[u] % mod) % mod;
                for (int v: g[u]) {
                    if (v == pr || del[v]) continue;
                    self(self, v, u);
                }
            };
            dfs(dfs, v, rt);
        }
        del[rt] = 1;
        for (auto v: g[rt]) {
            if (del[v]) continue;
            self(self, v, siz[v]);
        }
    };
    sol(sol, 1, n);
    int tot = (n * (n - 1) / 2 % mod) * (n * (n - 1) / 2 % mod) % mod;
    cout << ans * inv(tot) % mod << endl;
}

signed main() {
    IOS
    int te = 1;
    cin >> te;
    while (te--) solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3836kb

input:

2
3
1 2
2 3
5
1 2
1 5
3 2
4 2

output:

443664158
918384806

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 3ms
memory: 3804kb

input:

1000
7
3 6
4 3
5 3
2 6
1 4
7 1
12
5 7
10 7
2 10
11 2
1 7
8 1
4 2
9 11
6 9
12 11
3 5
6
2 5
1 2
4 5
6 4
3 6
5
2 5
1 5
4 5
3 2
8
1 8
2 8
4 2
6 1
5 6
7 6
3 8
8
3 8
7 3
4 8
6 4
2 7
5 2
1 4
4
3 1
4 3
2 1
6
5 1
6 1
2 5
3 5
4 2
12
8 11
5 11
12 8
3 12
6 12
2 3
4 6
10 11
1 5
9 5
7 5
9
6 1
7 6
4 7
8 7
5 4
9 6
...

output:

948445317
537163631
363804611
918384806
711758412
935854084
776412276
869581749
576350909
284992603
938164834
717873256
868225091
670079545
435776797
908032643
29104004
584006902
60634104
221832080
300435804
56023919
867301808
183319566
698771049
503247155
955849780
365428738
310564911
286902823
368...

result:

wrong answer 2nd lines differ - expected: '468414020', found: '537163631'