結果
| 問題 |
No.898 tri-βutree
|
| コンテスト | |
| ユーザー |
alexara1123
|
| 提出日時 | 2019-11-13 12:18:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 369 ms / 4,000 ms |
| コード長 | 4,289 bytes |
| コンパイル時間 | 1,370 ms |
| コンパイル使用メモリ | 110,008 KB |
| 実行使用メモリ | 20,536 KB |
| 最終ジャッジ日時 | 2024-11-08 23:09:27 |
| 合計ジャッジ時間 | 9,436 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <numeric>
#include <functional>
#include <cmath>
#include <cassert>
#include <string>
#include <iostream>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<ll, ll> PL;
const ll MOD = 1000000007;
const int mod = 1000000007;
ll INF = 1LL << 60;
template <typename T>
istream &operator>>(istream &is, vector<T> &vec)
{
for (auto &v : vec)
is >> v;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec)
{
os << "[";
for (auto v : vec)
os << v << ",";
os << "]";
return os;
}
template <typename T>
ostream &operator<<(ostream &os, const deque<T> &vec)
{
os << "deq[";
for (auto v : vec)
os << v << ",";
os << "]";
return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &vec)
{
os << "{";
for (auto v : vec)
os << v << ",";
os << "}";
return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec)
{
os << "{";
for (auto v : vec)
os << v << ",";
os << "}";
return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &vec)
{
os << "{";
for (auto v : vec)
os << v << ",";
os << "}";
return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec)
{
os << "{";
for (auto v : vec)
os << v << ",";
os << "}";
return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa)
{
os << "(" << pa.first << "," << pa.second << ")";
return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp)
{
os << "{";
for (auto v : mp)
os << v.first << "=>" << v.second << ",";
os << "}";
return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp)
{
os << "{";
for (auto v : mp)
os << v.first << "=>" << v.second << ",";
os << "}";
return os;
};
#define dbg(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val)
{
fill((T *)array, (T *)(array + N), val);
}
struct LCA
{
int n, h;
vector<vector<int>> par;
vector<vector<pair<int, int>>> v;
vector<ll> depth, dis;
LCA(int sz) : n(sz), v(n), depth(n), dis(n)
{
h = 1;
while ((1 << h) < n)
h++;
par.assign(h, vector<int>(n, -1));
}
void add_edge(int x, int y, int z)
{
v[x].push_back({y, z});
v[y].push_back({x, z});
}
void dfs(int x, int p, int d, ll di)
{
par[0][x] = p;
depth[x] = d;
dis[x] = di;
for (auto to : v[x])
if (to.first != p)
dfs(to.first, x, d + 1, di + to.second);
}
void build()
{
dfs(0, -1, 0, 0);
for(int i=0; i < h-1; i++)
{
for(int j=0; j < n; j++)
{
if (par[i][j] < 0)
par[i + 1][j] = -1;
else
par[i + 1][j] = par[i][par[i][j]];
}
}
}
int lca(int u, int v)
{
if (depth[u] > depth[v])
swap(u, v);
for(int i=0; i < h; i++) if ((depth[v] - depth[u]) >> i & 1) v = par[i][v];
if (u == v)
return u;
for (int i = h - 1; i >= 0; i--)
{
if (par[i][u] != par[i][v])
{
u = par[i][u];
v = par[i][v];
}
}
return par[0][u];
}
ll dist(int u, int v)
{
return dis[u] + dis[v] - 2 * dis[lca(u, v)];
}
};
int solve()
{
ll n;
cin >> n;
LCA lca(n);
for(int i=0; i < n-1; i++){
ll u, v, w;
cin >> u >> v >> w;
lca.add_edge(u, v, w);
}
lca.build();
ll q;
cin >> q;
while (q--)
{
ll a,b,c;
cin >> a >> b >> c;
cout << (lca.dist(a,b) + lca.dist(b,c) + lca.dist(c,a))/2 << endl;
}
return 0;
}
int main()
{
//cout.precision(10)
ios::sync_with_stdio(false);
cin.tie(0);
solve();
}
alexara1123