提出 #11958953
ソースコード 拡げる
#include <bits/stdc++.h>
typedef long long int ll;
using namespace std;
ll N, M;
vector<int> edge[200000];
ll dp[200000];
ll dp2[200000];
map<ll, map<ll,ll>> dp3;
void dfs(int cur, int par) {
ll x = 1;
for (auto c : edge[cur]) {
if (c == par) continue;
dfs(c, cur);
x *= dp[c] + 1;
x %= M;
}
dp[cur] = x;
}
void dfs2(int cur, int par) {
ll x = 1;
if (par != -1) {
x *= (dp3[par][cur] + 1);
x %= M;
}
for (auto c : edge[cur]) {
if (c == par) continue;
dfs2(c, cur);
x *= dp[c] + 1;
x %= M;
}
dp2[cur] = x;
}
ll prefix[200000];
ll suffix[200000];
void dfs3(int par, int ppar) {
ll N = edge[par].size();
if (N > 0) {
prefix[0] = 1;
if (edge[par][0] != ppar) prefix[0] = dp[edge[par][0]] + 1;
for (int i=1; i<N; i++) {
ll cur = edge[par][i];
prefix[i] = prefix[i-1];
if (cur != ppar) prefix[i] *= dp[cur] + 1;
prefix[i] %= M;
}
suffix[N-1] = 1;
if (edge[par][N-1] != ppar) suffix[N-1] = dp[edge[par][N-1]] + 1;
for (int i=N-2; i>=0; i--) {
ll cur = edge[par][i];
suffix[i] = suffix[i+1];
if (cur != ppar) suffix[i] *= dp[cur] + 1;
suffix[i] %= M;
}
}
// for (int i=0; i<N; i++) {
// printf("par=%ld i=%ld prefix=%ld suffix=%ld dp[edge[par][i]]=%ld\n", par, i, prefix[i], suffix[i], dp[edge[par][i]]);
// }
for (int i=0; i<edge[par].size(); i++) {
ll cur = edge[par][i];
if (cur == ppar) continue;
ll x = 1;
if (ppar != -1) {
x *= (dp3[ppar][par] + 1) % M;
}
if (i-1 >= 0) { x *= prefix[i-1]; x %= M;}
if (i+1 < N) { x *= suffix[i+1]; x %= M;}
dp3[par][cur] = x;
// printf("N=%d i=%d par=%ld cur=%ld dp3[par][cur]=%ld\n", N, i, par, cur, dp3[par][cur]);
// dfs3(cur, par);
}
for (auto cur: edge[par]) {
if (cur == ppar) continue;
dfs3(cur, par);
}
}
int main() {
cin >> N >> M;
for (int i=0; i<N-1; i++) {
int x, y;
cin >> x >> y;
x--; y--;
edge[x].push_back(y);
edge[y].push_back(x);
}
dfs(0, -1);
dfs3(0, -1);
dfs2(0, -1);
for (int i=0; i<N; i++) {
cout << dp2[i] << endl;
}
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | V - Subtree |
| ユーザ | bobuhiro11 |
| 言語 | C++14 (GCC 5.4.1) |
| 得点 | 100 |
| コード長 | 2252 Byte |
| 結果 | AC |
| 実行時間 | 430 ms |
| メモリ | 40064 KiB |
ジャッジ結果
| セット名 | All | ||
|---|---|---|---|
| 得点 / 配点 | 100 / 100 | ||
| 結果 |
|
| セット名 | テストケース |
|---|---|
| All | 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13, 1_14, 1_15, 1_16, 1_17, 1_18, 1_19, 1_20, 1_21, 1_22, 1_23, 1_24, 1_25, 1_26, 1_27, 1_28, 1_29, 1_30, 1_31 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 0_00 | AC | 4 ms | 9088 KiB |
| 0_01 | AC | 4 ms | 9088 KiB |
| 0_02 | AC | 3 ms | 9088 KiB |
| 0_03 | AC | 3 ms | 9216 KiB |
| 1_00 | AC | 3 ms | 9088 KiB |
| 1_01 | AC | 3 ms | 9088 KiB |
| 1_02 | AC | 373 ms | 38912 KiB |
| 1_03 | AC | 416 ms | 38144 KiB |
| 1_04 | AC | 301 ms | 20344 KiB |
| 1_05 | AC | 299 ms | 21112 KiB |
| 1_06 | AC | 321 ms | 20216 KiB |
| 1_07 | AC | 327 ms | 20984 KiB |
| 1_08 | AC | 295 ms | 19456 KiB |
| 1_09 | AC | 302 ms | 20352 KiB |
| 1_10 | AC | 290 ms | 19328 KiB |
| 1_11 | AC | 285 ms | 20096 KiB |
| 1_12 | AC | 282 ms | 19584 KiB |
| 1_13 | AC | 286 ms | 20352 KiB |
| 1_14 | AC | 319 ms | 20736 KiB |
| 1_15 | AC | 304 ms | 21504 KiB |
| 1_16 | AC | 314 ms | 22400 KiB |
| 1_17 | AC | 339 ms | 23424 KiB |
| 1_18 | AC | 336 ms | 23424 KiB |
| 1_19 | AC | 333 ms | 24192 KiB |
| 1_20 | AC | 327 ms | 23808 KiB |
| 1_21 | AC | 334 ms | 24832 KiB |
| 1_22 | AC | 334 ms | 24448 KiB |
| 1_23 | AC | 334 ms | 25216 KiB |
| 1_24 | AC | 331 ms | 24448 KiB |
| 1_25 | AC | 385 ms | 25472 KiB |
| 1_26 | AC | 338 ms | 25472 KiB |
| 1_27 | AC | 346 ms | 25600 KiB |
| 1_28 | AC | 392 ms | 29696 KiB |
| 1_29 | AC | 349 ms | 28672 KiB |
| 1_30 | AC | 362 ms | 34560 KiB |
| 1_31 | AC | 430 ms | 40064 KiB |