結果

問題 No.898 tri-βutree
ユーザー okok
提出日時 2019-10-04 21:47:25
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,457 bytes
コンパイル時間 2,376 ms
コンパイル使用メモリ 96,844 KB
実行使用メモリ 32,152 KB
最終ジャッジ日時 2024-10-03 07:25:23
合計ジャッジ時間 5,812 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 81 ms
32,152 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<vector>
#include<algorithm>

using namespace std;

#define int long long
#define endl "\n"

const long long INF = (long long)1e18;
const long long MOD = 1'000'000'007; 

string yn(bool f){return f?"Yes":"No";}
string YN(bool f){return f?"YES":"NO";}

struct edge{
	int to, cost;
};


vector<vector<edge>> G;


vector<int> depth;
vector<vector<int>> table;

void dfs(int node, int per, int dep){
	
	table[0][node] = per;
	depth[node] = dep;
	
	for(edge e : G[node]){
		if(e.to == per) continue;
		dfs(e.to, node, dep+1);
	}
}

void init(int V){
	
	int logV = 1;
	
	for(int i = 1; i <= V; i <<= 1, logV++);
	
	depth.clear();
	depth.resize(V+1);
	table.clear();
	table.resize(logV, vector<int>(V+1,-1));
	
	dfs(1, -1, 0);
	
	for(int k = 0; k + 1 < logV; k++){
		for(int v = 0; v < V; v++){
			if(table[k][v] < 0) table[k+1][v] = -1;
			else table[k+1][v] = table[k][table[k][v]];
		}
	}
}

int lca(int u, int v){
	
	if(depth[u] > depth[v]) swap(u, v);
	for(int k = 0; k < table.size(); k++){
		if((depth[v] - depth[u]) >> k & 1){
			v = table[k][v];
		}
	}
	
	if(u == v) return u; 
	
	for(int k = table.size()-1; k >= 0; k--){
		if(table[k][u] != table[k][v]){
			u = table[k][u];
			v = table[k][v];
		}
	}
	
	return table[0][u];
}

vector<int> cost;

void dfs2(int now = 1, int pre = -1, int sum = 0){
	
	cost[now] = sum;
	
	for(int i = 0; i < G[now].size(); i++){
		if(G[now][i].to == pre) continue;
		
		dfs2(G[now][i].to,now,sum + G[now][i].cost);
	}
}

signed main(){
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	cout<<fixed<<setprecision(10);
	
	int N, Q;
	// vector<vector<pair<int,int>>> G;
	
	cin>>N;
	
	G.resize(N+1);
	cost.resize(N+1);
	
	for(int i = 0; i < N-1; i++){
		int a, b, c;
		
		cin>>a>>b>>c;
		a++;b++;
		
		G[a].push_back(edge{b,c});
		G[b].push_back(edge{a,c});
		// G[a].push_back(make_pair(b,c));
		// G[b].push_back(make_pair(a,c));
	}
	
	init(N+1);
	dfs2();
	
	cin>>Q;
	
	// for(int i = 1; i <= N; i++){
		// cout<<"i = "<<i-1<<" cost = "<<cost[i]<<endl;
	// }
	
	for(int i = 0; i < Q; i++){
		int a, b, c, ab, bc, ca, abc;
		int sum = 0;
		
		cin>>a>>b>>c;
		a++, b++, c++;
		
		ab = lca(a,b);
		bc = lca(b,c);
		ca = lca(c,a);
		
		abc = lca(ab, c);
		
		// cout<<"ab "<<ab<<" bc "<<bc<<" ca "<<ca<<" abc "<<abc<<endl;
		
		sum = cost[a] + cost[b] + cost[c] - cost[ab] - cost[bc] - cost[ca] + cost[abc];
		
		cout<<sum<<endl;
	}
	
	
	return 0;
}
0