結果
| 問題 | No.1843 Tree ANDistance |
| コンテスト | |
| ユーザー |
startcpp
|
| 提出日時 | 2026-02-08 13:47:42 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 409 ms / 2,000 ms |
| コード長 | 679 bytes |
| 記録 | |
| コンパイル時間 | 1,385 ms |
| コンパイル使用メモリ | 101,372 KB |
| 実行使用メモリ | 10,008 KB |
| 最終ジャッジ日時 | 2026-02-08 13:47:55 |
| 合計ジャッジ時間 | 11,429 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 38 |
ソースコード
#include <iostream>
#include <atcoder/dsu>
#include <atcoder/modint>
#define rep(i, n) for(i = 0; i < n; i++)
using namespace std;
using namespace atcoder;
using mint = modint1000000007;
int n;
int a[100000], b[100000], c[100000];
int main() {
int i, j;
cin >> n;
rep(i, n - 1) {
cin >> a[i] >> b[i] >> c[i];
a[i]--; b[i]--;
}
mint inv2 = mint(2).inv();
mint ans = 0;
rep(i, 30) {
dsu uf(n);
rep(j, n - 1) {
if ((c[j] >> i) & 1) {
uf.merge(a[j], b[j]);
}
}
mint tori = 0;
for (auto g: uf.groups()) {
int sz = g.size();
tori += mint(sz) * mint(sz - 1) * inv2;
}
ans += mint(1 << i) * tori;
}
cout << ans.val() << endl;
return 0;
}
startcpp