結果
| 問題 |
No.399 動的な領主
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2018-10-27 04:10:12 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,603 bytes |
| コンパイル時間 | 823 ms |
| コンパイル使用メモリ | 98,968 KB |
| 実行使用メモリ | 23,144 KB |
| 最終ジャッジ日時 | 2024-11-19 06:37:15 |
| 合計ジャッジ時間 | 3,856 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 19 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
int n;
vector<int> g[100000];
int d[100000];
int p[17][100000];
bool used[100000];
void dfs0(int x){
used[x]=1;
for(auto y:g[x]){
if(!used[y]){
d[y]=d[x]+1;
p[0][y]=x;
dfs0(y);
}
}
}
ll ct[100000];
void dfs(int x){
used[x]=1;
for(auto y:g[x]){
if(!used[y]){
dfs(y);
ct[x]+=ct[y];
}
}
}
int lca(int a, int b){
if(d[a]>d[b]) swap(a, b);
int a1=a, b1=b;
int dd=d[b]-d[a], i=0;
while(dd>0){
if(dd%2==1){
b1=p[i][b1];
}
dd/=2;
i++;
}
if(a1==b1) return a1;
for(int i=16; i>=0; i--){
if(p[i][a1]!=p[i][b1]){
a1=p[i][a1], b1=p[i][b1];
}
}
return p[0][a1];
}
int main()
{
cin>>n;
for(int i=0; i<n-1; i++){
int u, v;
cin>>u>>v;
u--; v--;
g[u].push_back(v);
g[v].push_back(u);
}
dfs0(0);
for(int i=1; i<17; i++){
for(int x=0; x<n; x++){
p[i][x]=p[i-1][p[i-1][x]];
}
}
int q;
cin>>q;
for(int t=0; t<q; t++){
int a, b;
cin>>a>>b;
a--; b--;
int c=lca(a, b);
ct[a]++;
ct[b]++;
if(c>0){
ct[p[0][c]]-=1;
}
}
fill(used, used+n, 0);
dfs(0);
ll ans=0;
for(int i=0; i<n; i++){
ans+=(ct[i]*(ct[i]+1)/2);
}
cout<<ans<<endl;
return 0;
}
chocorusk