結果
問題 |
No.399 動的な領主
|
ユーザー |
![]() |
提出日時 | 2025-05-01 11:07:52 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 204 ms / 2,000 ms |
コード長 | 1,547 bytes |
コンパイル時間 | 4,307 ms |
コンパイル使用メモリ | 281,836 KB |
実行使用メモリ | 20,800 KB |
最終ジャッジ日時 | 2025-05-01 11:08:01 |
合計ジャッジ時間 | 8,135 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 19 |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll = long long; int sizesubtree[100009], par[100009], idx[100009], fir[100009]; vector<vector<int>> G; vector<int> tour = {0}; void dfs1(int now, int pre = -1) { sizesubtree[now] = 1; for (int &nex : G[now]) { if (nex == pre) continue; par[nex] = now; dfs1(nex, now); sizesubtree[now] += sizesubtree[nex]; if (sizesubtree[nex] > sizesubtree[G[now][0]] || G[now][0] == pre) swap(nex, G[now][0]); } } void dfs2(int now, int a, int pre = -1) { fir[now] = a; idx[now] = tour.size(); tour.push_back(now); for (int i = 0; i < (int)G[now].size(); i++) { int nex = G[now][i]; if (nex == pre) continue; if (i == 0) dfs2(nex, a, now); else dfs2(nex, nex, now); } } int main() { int n; cin >> n; G.resize(n + 1); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } dfs1(1); dfs2(1, 1); vector<ll> s(n + 2, 0); int q; cin >> q; while (q--) { int a, b; cin >> a >> b; while (fir[a] != fir[b]) { if (idx[fir[a]] > idx[fir[b]]) swap(a, b); s[idx[fir[b]]]++; s[idx[b] + 1]--; b = par[fir[b]]; } if (idx[a] > idx[b]) swap(a, b); s[idx[a]]++; s[idx[b] + 1]--; } for (int i = 1; i <= n; i++) s[i] += s[i - 1]; ll res = 0; for (int i = 1; i <= n; i++) res += s[i] * (s[i] + 1) / 2; cout << res << endl; }