結果
問題 | No.399 動的な領主 |
ユーザー | tossy |
提出日時 | 2016-08-20 13:45:09 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,314 bytes |
コンパイル時間 | 1,135 ms |
コンパイル使用メモリ | 98,620 KB |
実行使用メモリ | 22,456 KB |
最終ジャッジ日時 | 2024-11-07 21:31:01 |
合計ジャッジ時間 | 5,132 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
5,760 KB |
testcase_01 | AC | 4 ms
5,888 KB |
testcase_02 | AC | 4 ms
5,760 KB |
testcase_03 | AC | 4 ms
5,760 KB |
testcase_04 | AC | 4 ms
5,888 KB |
testcase_05 | AC | 12 ms
6,912 KB |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | AC | 4 ms
5,888 KB |
testcase_11 | AC | 10 ms
6,912 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
ソースコード
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <cassert> #include <iostream> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <set> #include <map> #include <bitset> using namespace std; #define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++) #define rep(i,n) repl(i,0,n) #define mp(a,b) make_pair(a,b) #define pb(a) push_back(a) #define all(x) (x).begin(),(x).end() #define dbg(x) cout<<#x"="<<x<<endl #define INF 1<<30 vector<int> tree[100010]; class LCA { private: int n,ln; // number of nodes and log n public: vector<vector<int> > parent; vector<int> depth; LCA(int _n) : n(_n), depth(_n){ ln=0; while(n>(1<<ln)) ln++; // calc log n parent = vector<vector<int> >(ln, vector<int>(n)); } void dfs(int v, int p, int d){ parent[0][v]=p; depth[v]=d; rep(i,tree[v].size()) if(tree[v][i]!=p) dfs(tree[v][i], v, d+1); } void init(int root){ dfs(root, -1, 0); for(int k=0; k+1<ln; k++){ for(int v=0; v<n; v++){ if(parent[k][v] < 0) parent[k+1][v] = -1; else parent[k+1][v] = parent[k][parent[k][v]]; } } } int query(int u, int v){ if(depth[u] > depth[v]) swap(u,v); for(int k=0; k<ln; k++){ if((depth[v]-depth[u])>>k & 1) v = parent[k][v]; } // now, depth[v] == depth[u] if(u==v) return u; for(int k=ln-1; k>=0; k--){ if(parent[k][u] != parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } }; // END class LCA vector<int> memo; // imos dfs, node n from f int imosTree(int n, int f){ int res=memo[n]; rep(i,tree[n].size()){ if(tree[n][i]!=f) res += imosTree(tree[n][i], n); } return memo[n]=res; } int main(){ int n, q; cin>>n; rep(i,n-1){ int u,v; scanf("%d %d", &u, &v); u--;v--; tree[u].pb(v); tree[v].pb(u); } LCA lca(n); lca.init(0); memo = vector<int>(n, 0); cin>>q; rep(i,q){ int a,b; scanf("%d %d", &a, &b); a--;b--; int p = lca.query(a,b); memo[a]++; memo[b]++; memo[p]--; if(lca.parent[0][p]!=-1) memo[lca.parent[0][p]]--; } // imos in tree imosTree(0,-1); // calc result long res=0; rep(i,n) res += memo[i]*(memo[i]+1)/2; cout<<res<<endl; return 0; }