結果
| 問題 | No.399 動的な領主 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-09-12 11:07:43 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,326 bytes |
| コンパイル時間 | 347 ms |
| コンパイル使用メモリ | 51,576 KB |
| 最終ジャッジ日時 | 2024-11-14 19:49:36 |
| 合計ジャッジ時間 | 1,147 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:9:9: error: ‘vector’ does not name a type
9 | typedef vector<int> V;
| ^~~~~~
main.cpp:12:1: error: ‘V’ does not name a type
12 | V t[100000];
| ^
main.cpp: In function ‘void dfs(int)’:
main.cpp:18:20: error: ‘t’ was not declared in this scope
18 | for(int i: t[x]){
| ^
main.cpp: In function ‘int cs(int)’:
main.cpp:64:20: error: ‘t’ was not declared in this scope
64 | for(int i: t[x]){
| ^
main.cpp: In function ‘int main()’:
main.cpp:77:17: error: ‘t’ was not declared in this scope
77 | t[--u].push_back(--v);
| ^
ソースコード
#include <iostream>
#include <algorithm>
#define rep(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
typedef vector<int> V;
int n;
V t[100000];
int d[100000];
int k[100000][17];
ll v[100000];
void dfs(int x){
for(int i: t[x]){
if(d[i] == -1){
d[i] = d[x] + 1;
k[i][0] = x;
dfs(i);
}
}
}
void init(){
fill_n(d, n, -1);
d[0] = 0;
k[0][0] = -1;
dfs(0);
for(int j = 1; j < 17; ++j){
rep(i, n){
k[i][j] = k[i][j - 1] >= 0 ? k[k[i][j - 1]][j - 1] : -1;
}
}
}
int up(int v, int x){
rep(i, 17){
if(x >> i & 1){
v = k[v][i];
}
}
return v;
}
int lca(int u, int v){
if(d[u] > d[v]){
swap(u, v);
}
v = up(v, d[v] - d[u]);
if(u == v){
return u;
}
for(int i = 16; i >= 0; --i){
if(k[u][i] != k[v][i]){
u = k[u][i];
v = k[v][i];
}
}
return k[u][0];
}
int cs(int x = 0){
for(int i: t[x]){
if(d[x] < d[i]){
v[x] += cs(i);
}
}
return v[x];
}
int main(){
cin >> n;
rep(i, n - 1){
int u, v;
cin >> u >> v;
t[--u].push_back(--v);
t[v].push_back(u);
}
init();
int q;
cin >> q;
rep(i, q){
int a, b;
cin >> a >> b;
int c = lca(--a, --b);
--v[c];
if(k[c][0] != -1){
--v[k[c][0]];
}
++v[a];
++v[b];
}
cs();
ll ans = 0;
rep(i, n){
ans += v[i] * (v[i] + 1) / 2;
}
cout << ans << endl;
return 0;
}