結果
| 問題 | No.898 tri-βutree |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-20 23:29:39 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,156 bytes |
| 記録 | |
| コンパイル時間 | 6,331 ms |
| コンパイル使用メモリ | 355,420 KB |
| 実行使用メモリ | 35,240 KB |
| 最終ジャッジ日時 | 2026-10-20 23:29:58 |
| 合計ジャッジ時間 | 12,292 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge6_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 1 WA * 20 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
vector<int>eg[100010];
vector<long long>wt[100010];
int dep[100010],f[100010][30];
long long sum[100010];
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(int i=1;i<=20;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=0;i<eg[u].size();i++)
{
int v=eg[u][i],w=wt[u][i];
if(v==fa)continue;
sum[v]=sum[u]+w;
dfs(v,u);
}
}
int getlca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)
{
if(dep[f[x][i]]>=dep[y])x=f[x][i];
}
if(x==y)return x;
for(int i=20;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
// freopen("lucky.in","r",stdin);
// freopen("lucky.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,q,u,v,x,y,z,lca,lca1,lca2,fa;
long long w,ans;
cin>>n;
for(int i=1;i<n;i++)
{
cin>>u>>v>>w;
++u,++v;
eg[u].push_back(v);
eg[v].push_back(u);
wt[u].push_back(w);
wt[v].push_back(w);
}
dfs(1,0);
cin>>q;
while(q--)
{
cin>>x>>y>>z;
++x,++y,++z;
if(dep[x]<dep[z])swap(x,z);
if(dep[y]<dep[z])swap(y,z);
lca=getlca(x,y);
lca1=getlca(x,z);
lca2=getlca(y,z);
fa=f[lca][0];
ans=sum[x]+sum[y]-sum[lca]-sum[fa];
if(getlca(z,lca)==lca)
{
if(lca1==lca&&lca2==lca)
{
ans+=(sum[z]-sum[lca]);
}
else if(lca1!=lca&&lca1!=x&&lca1!=z)
{
ans+=(sum[z]-sum[lca1]);
}
else if(lca2!=lca&&lca2!=x&&lca2!=z)
{
ans+=(sum[z]-sum[lca2]);
}
}
else
{
if(getlca(z,lca)==z)
{
ans+=(sum[f[lca][0]]-sum[f[z][0]]);
}
else
{
ans+=(sum[f[lca][0]]+sum[z]-sum[1]);
}
}
cout<<ans<<"\n";
}
return 0;
}