結果
| 問題 |
No.399 動的な領主
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-10-13 00:20:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,173 bytes |
| コンパイル時間 | 1,689 ms |
| コンパイル使用メモリ | 170,752 KB |
| 実行使用メモリ | 25,616 KB |
| 最終ジャッジ日時 | 2024-10-13 00:21:04 |
| 合計ジャッジ時間 | 4,611 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 WA * 16 |
ソースコード
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//# define int long long
int N;
vector<int> e[101010];
int f[200005][21],dep[200005];
ll tot[200005];
ll ret;
void dfs (int u, int fa)
{
f[u][0] = fa, dep[u] = dep[fa] + 1;
for (int v : e[u])
{
if (v == fa) continue;
dfs (v, u);
}
}
int lca(int a,int b) {
int ret=0,i,aa=a,bb=b;
if(dep[aa]>dep[bb]) swap(aa,bb);
for(i=19;i>=0;i--) if(dep[bb]-dep[aa]>=1<<i) bb=f[i][bb];
for(i=19;i>=0;i--) if(f[aa][i]!=f[bb][i]) aa=f[aa][i], bb=f[bb][i];
return (aa==bb)?aa:f[aa][0]; // 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,-1);
// return 0;
for (int i = 0; i < 19; i ++ )
for (int x = 0; x < N; x ++ )
f[x][i+1]=f[f[x][i]][i];
cin>>i;
while(i--) {
cin>>x>>y;
x--,y--;
int lc=lca(x,y);
tot[x]++;
tot[y]++;
tot[lc]--;
if(lc!=0) tot[f[lc][0]]--;
}
dfs2(0,-1);
cout<<ret<<endl;
}