結果
| 問題 | No.2584 The University of Tree |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-01-24 08:17:55 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 323 ms / 3,000 ms |
| コード長 | 2,132 bytes |
| 記録 | |
| コンパイル時間 | 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];
| ~~~~~^
ソースコード
#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;
}