結果

問題 No.2584 The University of Tree
コンテスト
ユーザー fdironia
提出日時 2024-01-24 08:17:55
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 323 ms / 3,000 ms
コード長 2,132 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,164 ms
コンパイル使用メモリ 171,020 KB
実行使用メモリ 55,168 KB
最終ジャッジ日時 2026-04-14 23:38:12
合計ジャッジ時間 10,717 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 53
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'void dfs1(vp*, int, int, vi*, int*)':
main.cpp:46:19: warning: '*pos.23[1]' may be used uninitialized [-Wmaybe-uninitialized]
   46 |     ans[u] = pos[1];
      |              ~~~~~^

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <utility>

using namespace std;

constexpr int Z = 998244353;

using pii = pair<int, int>;
using vp = vector<pii>;
using vi = vector<int>;

void dfs0(vp e[], int u, int p, int pord, vi dp[]) {
    dp[u].resize(e[u].size());
    dp[u][0] = 1;

    for (int i = 1; i < (int)e[u].size(); i++) {
        int v = e[u][i].second;

        if (v == p) {
            e[p][pord].first = i;
            e[u][i].first = pord;
        } else {
            dfs0(e, v, u, i, dp);
            int ord = e[u][i].first, dv = e[v].size();
            for (int j = 0; j < (int)e[v].size() - 1; j++) {
                dp[u][i] = 1ll * (dp[u][i] + dp[v][(ord-1-j+dv)%dv]) * (v + 1) % Z;
            }
        }
    }
}

void dfs1(vp e[], int u, int p, vi dp[], int ans[]) {
    int pre[e[u].size()];
    int pu = 1;
    for (int i = 0; i < (int)e[u].size(); i++) {
        pu = 1ll * pu * (u + 1) % Z;
        pre[i] = ((i == 0 ? 0 : pre[i-1]) + 1ll * pu * dp[u][i]) % Z;
    }

    int pos[e[u].size()+1];
    for (int i = (int)e[u].size(); i >= 0; i--) {
        pos[i] = i == (int)e[u].size() ? 0 : 1ll * (pos[i+1] + dp[u][i]) * (u + 1) % Z;
    }

    ans[u] = pos[1];

    pu = 1;
    for (int i = (int)e[u].size() - 1; i >= 1; i--) {
        auto [ord, v] = e[u][i];

        if (v != p) {
            dp[v][ord] = (pos[i+1] + 1ll * pu * pre[i-1]) % Z;
            dfs1(e, v, u, dp, ans);
        }

        pu = 1ll * pu * (u + 1) % Z;
    }
}

int main() {
    int n;
    cin >> n;
    vp e[n];
    int e2[n-1];
    fill(e2, e2 + n - 1, 0);
    for (int i = 0; i < n; i++) {
        int d;
        cin >> d;
        e[i].resize(d + 1);
        for (int j = 1; j <= d; j++) {
            cin >> e[i][j].first;
            e2[--e[i][j].first] ^= i;
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 1; j < (int)e[i].size(); j++) {
            e[i][j].second = e2[e[i][j].first] ^ i;
        }
    }

    vi dp[n];
    dfs0(e, 0, -1, -1, dp);

    int ans[n];
    dfs1(e, 0, -1, dp, ans);

    for (int i = 0; i < n; i++) {
        cout << ans[i] << endl;
    }

    return 0;
}
0