結果

問題 No.3373 Partial Complement Tree
コンテスト
ユーザー テナガザル
提出日時 2025-11-21 22:03:22
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 275 ms / 2,000 ms
コード長 1,013 bytes
コンパイル時間 1,227 ms
コンパイル使用メモリ 113,156 KB
実行使用メモリ 39,808 KB
最終ジャッジ日時 2025-11-21 22:03:42
合計ジャッジ時間 6,711 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 24
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

void solve()
{
  const int mod = 998244353;
  int n;
  cin >> n;
  vector<vector<int>> g(n);
  for (int i = 1; i < n; ++i)
  {
    int a, b;
    cin >> a >> b;
    --a, --b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  vector<vector<long long>> dp(n, vector<long long> (4));
  long long ans = 0;
  auto dfs = [&](auto dfs, int now, int p) -> void
  {
    for (auto to : g[now])
    {
      if (to == p) continue;
      dfs(dfs, to, now);
    }
    dp[now][0] = 1;
    for (auto to : g[now])
    {
      if (to == p) continue;
      for (int i = 0; i < 3; ++i) dp[now][i + 1] += dp[to][i];
    }
    ans = (ans + dp[now][3]) % mod;
    for (auto to : g[now])
    {
      if (to == p) continue;
      long long v1 = dp[now][2] - dp[to][1] + mod, v2 = dp[to][0];
      ans = (ans + v1 * v2) % mod;
    }
  };
  dfs(dfs, 0, -1);
  cout << ans << endl;
}

int main()
{
  int t;
  cin >> t;
  while (t--) solve();
}
0