提出 #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
結果
AC × 36
セット名 テストケース
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