結果
| 問題 | No.399 動的な領主 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-10-13 00:21:30 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 250 ms / 2,000 ms |
| コード長 | 1,121 bytes |
| コンパイル時間 | 1,744 ms |
| コンパイル使用メモリ | 171,832 KB |
| 実行使用メモリ | 32,668 KB |
| 最終ジャッジ日時 | 2024-10-13 00:21:36 |
| 合計ジャッジ時間 | 5,116 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 |
ソースコード
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//# define int long long
int N;
vector<int> E[101010];
int P[21][200005],D[200005];
ll tot[200005];
ll ret;
void dfs(int cur) {
for (auto it : E[cur])
if(it!=P[0][cur]) D[it]=D[cur]+1, P[0][it]=cur, dfs(it);
}
int lca(int a,int b) {
int ret=0,i,aa=a,bb=b;
if(D[aa]>D[bb]) swap(aa,bb);
for(i=19;i>=0;i--) if(D[bb]-D[aa]>=1<<i) bb=P[i][bb];
for(i=19;i>=0;i--) if(P[i][aa]!=P[i][bb]) aa=P[i][aa], bb=P[i][bb];
return (aa==bb)?aa:P[0][aa]; // vertex
}
void dfs2(int cur,int pre) {
for (auto e : E[cur]) if(e!=pre) dfs2(e,cur);
if(pre>=0) tot[pre] += tot[cur];
ret += tot[cur]*(tot[cur]+1)/2;
}
signed main ()
{
int i,j,k,l,r,x,y; string s;
cin>>N;
for (int i = 0; i < N-1; i ++ )
{
cin>>x>>y;
E[x-1].push_back(y-1);
E[y-1].push_back(x-1);
}
dfs(0);
for (int i = 0; i < 19; i ++ )
for (int x = 0; x < N; x ++ )
P[i+1][x]=P[i][P[i][x]];
cin>>i;
while(i--) {
cin>>x>>y;
x--,y--;
int lc=lca(x,y);
tot[x]++;
tot[y]++;
tot[lc]--;
if(lc!=0) tot[P[0][lc]]--;
}
dfs2(0,-1);
cout<<ret<<endl;
}