結果
問題 | No.1843 Tree ANDistance |
ユーザー |
![]() |
提出日時 | 2022-02-19 10:53:45 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 540 ms / 2,000 ms |
コード長 | 1,202 bytes |
コンパイル時間 | 1,719 ms |
コンパイル使用メモリ | 177,500 KB |
実行使用メモリ | 9,856 KB |
最終ジャッジ日時 | 2024-06-29 10:16:26 |
合計ジャッジ時間 | 11,264 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 38 |
ソースコード
#include <bits/stdc++.h> using namespace std; const long long MOD = 1E9 + 7; long long POW(long long a, long long b) { long long ans = 1; while (b > 0) { if (b & 1) { ans *= a; ans %= MOD; } a *= a; a %= MOD; b /= 2; } return ans; } int main() { int N; cin >> N; vector<vector<pair<int, int>>> E(N); for (int i = 0; i < N - 1; i++) { int A, B, C; cin >> A >> B >> C; A--; B--; E[A].push_back({C, B}); E[B].push_back({C, A}); } long long ans = 0; for (int i = 0; i < 32; i++) { vector<bool> used(N, false); for (int j = 0; j < N; j++) { if (!used[j]) { long long cnt = 1; used[j] = true; queue<int> Q; Q.push(j); while (!Q.empty()) { int v = Q.front(); Q.pop(); for (auto p : E[v]) { int w = p.second; int c = p.first; if (!used[w]) { if (c >> i & 1) { cnt++; used[w] = true; Q.push(w); } } } } ans += cnt * (cnt - 1) / 2 * POW(2, i) % MOD; } } } cout << ans % MOD << endl; }