結果
問題 | No.1002 Twotone |
ユーザー | とりゐ |
提出日時 | 2024-10-27 03:03:36 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,650 bytes |
コンパイル時間 | 3,357 ms |
コンパイル使用メモリ | 236,304 KB |
実行使用メモリ | 59,692 KB |
最終ジャッジ日時 | 2024-10-27 03:03:59 |
合計ジャッジ時間 | 21,490 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | AC | 2 ms
6,820 KB |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | AC | 2 ms
6,820 KB |
testcase_19 | AC | 676 ms
36,828 KB |
testcase_20 | AC | 779 ms
44,864 KB |
testcase_21 | AC | 816 ms
44,732 KB |
testcase_22 | AC | 2 ms
6,820 KB |
testcase_23 | AC | 575 ms
28,860 KB |
testcase_24 | AC | 1,173 ms
45,380 KB |
testcase_25 | AC | 1,091 ms
44,300 KB |
testcase_26 | AC | 2 ms
6,816 KB |
testcase_27 | AC | 216 ms
28,684 KB |
testcase_28 | AC | 344 ms
41,768 KB |
testcase_29 | AC | 315 ms
41,736 KB |
testcase_30 | AC | 2 ms
6,820 KB |
testcase_31 | AC | 304 ms
41,288 KB |
testcase_32 | AC | 382 ms
41,504 KB |
testcase_33 | AC | 307 ms
41,532 KB |
testcase_34 | AC | 1,273 ms
59,692 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, col] : g2[center]) { vector<pair<int, int>> add; vector<array<int, 4>> todo = {{v0, (int)center, col, -1}}; while (!todo.empty()) { auto [v, p, col1, col2] = todo.back(); todo.pop_back(); if (CD.dep[v] < CD.dep[center]) break; 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; }