結果
問題 | No.1002 Twotone |
ユーザー | とりゐ |
提出日時 | 2024-10-27 03:13:08 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,259 ms / 5,000 ms |
コード長 | 2,655 bytes |
コンパイル時間 | 3,139 ms |
コンパイル使用メモリ | 237,512 KB |
実行使用メモリ | 59,688 KB |
最終ジャッジ日時 | 2024-10-27 03:13:33 |
合計ジャッジ時間 | 21,422 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,816 KB |
testcase_03 | AC | 450 ms
31,348 KB |
testcase_04 | AC | 595 ms
39,848 KB |
testcase_05 | AC | 615 ms
39,972 KB |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | AC | 299 ms
26,628 KB |
testcase_08 | AC | 528 ms
41,736 KB |
testcase_09 | AC | 553 ms
41,728 KB |
testcase_10 | AC | 2 ms
6,816 KB |
testcase_11 | AC | 625 ms
32,836 KB |
testcase_12 | AC | 922 ms
41,576 KB |
testcase_13 | AC | 900 ms
41,204 KB |
testcase_14 | AC | 2 ms
6,816 KB |
testcase_15 | AC | 382 ms
24,972 KB |
testcase_16 | AC | 869 ms
41,536 KB |
testcase_17 | AC | 873 ms
41,160 KB |
testcase_18 | AC | 2 ms
6,816 KB |
testcase_19 | AC | 689 ms
37,004 KB |
testcase_20 | AC | 869 ms
45,008 KB |
testcase_21 | AC | 849 ms
44,580 KB |
testcase_22 | AC | 2 ms
6,816 KB |
testcase_23 | AC | 557 ms
28,860 KB |
testcase_24 | AC | 1,217 ms
45,460 KB |
testcase_25 | AC | 1,178 ms
44,292 KB |
testcase_26 | AC | 2 ms
6,820 KB |
testcase_27 | AC | 195 ms
28,808 KB |
testcase_28 | AC | 346 ms
41,756 KB |
testcase_29 | AC | 324 ms
41,664 KB |
testcase_30 | AC | 2 ms
6,820 KB |
testcase_31 | AC | 298 ms
41,312 KB |
testcase_32 | AC | 369 ms
41,492 KB |
testcase_33 | AC | 315 ms
41,644 KB |
testcase_34 | AC | 1,259 ms
59,688 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define rep(i, n) for (ll i = 0; i < ll(n); i++) #define rep2(i, l, r) for (ll i = ll(l); i < ll(r); i++) using vi = vector<int>; using vvi = vector<vi>; using vll = vector<ll>; struct CentroidDecomposition { int n; vvi g; vi sz, order, dep, par; CentroidDecomposition(int n, vvi &g) : n(n), g(g) { sz.resize(n); dep.resize(n, -1); par.resize(n, -1); dfs(0, -1); calc(0, -1, 0); }; int dfs(int v, int p) { sz[v] = 1; for (auto u : g[v]) { if (u != p) sz[v] += dfs(u, v); } return sz[v]; } void calc(int v, int p, int d) { int now = v; while (true) { int nxt = -1; for (auto u : g[now]) { if (dep[u] == -1 && sz[u] * 2 > sz[now]) nxt = u; } if (nxt == -1) break; int rem = sz[now] - sz[nxt]; sz[nxt] = sz[now]; sz[now] = rem; now = nxt; } dep[now] = d; par[now] = p; for (auto u : g[now]) { if (dep[u] == -1) { calc(u, v, d + 1); } } } }; int main() { int n, k; cin >> n >> k; vvi g(n); vector<vector<pair<int, int>>> g2(n); rep(i, n - 1) { int u, v, c; cin >> u >> v >> c; u--; v--; g[u].push_back(v); g[v].push_back(u); g2[u].push_back({v, c}); g2[v].push_back({u, c}); } CentroidDecomposition CD(n, g); ll ans = 0; rep(center, n) { map<pair<int, int>, int> cnt1; map<int, int> cnt2, cnt3; ll cnt4 = 0; for (auto [v0, col0] : g2[center]) { vector<pair<int, int>> add; vector<array<int, 4>> todo = {{v0, (int)center, col0, -1}}; while (!todo.empty()) { auto [v, p, col1, col2] = todo.back(); todo.pop_back(); if (CD.dep[v] < CD.dep[center]) continue; if (col1 < col2) swap(col1, col2); if (col2 == -1) { ans += cnt2[col1]; ans += cnt4 - cnt3[col1]; } else { ans += cnt1[{col1, col2}]; ans += cnt3[col1]; ans += cnt3[col2]; ans += 1; } add.push_back({col1, col2}); for (auto [u, col] : g2[v]) { if (u != p) { if (col == col1 || col == col2) { todo.push_back({u, v, col1, col2}); } else if (col2 == -1) { todo.push_back({u, v, col1, col}); } } } } for (auto [col1, col2] : add) { if (col2 != -1) { cnt1[{col1, col2}]++; cnt2[col1]++; cnt2[col2]++; } else { cnt3[col1]++; cnt4++; } } } } cout << ans << endl; }