結果

問題 No.898 tri-βutree
ユーザー btkbtk
提出日時 2019-10-04 22:37:48
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 864 ms / 4,000 ms
コード長 13,142 bytes
コンパイル時間 3,169 ms
コンパイル使用メモリ 204,692 KB
最終ジャッジ日時 2025-01-07 20:41:03
ジャッジサーバーID
(参考情報)
judge2 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 21
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:34:13: warning: #pragma once in main file
   34 | #    pragma once
      |             ^~~~

ソースコード

diff #
プレゼンテーションモードにする

// https://yukicoder.me/problems/no/898
#define CIN_ONLY
#define DECIMAL_DIGITS 10
#define STATIC_MOD 1e9 + 7
#ifdef BTK
/*<head>*/
# include "Template.hpp"
/*</head>*/
#else
/*<body>*/
/* #region auto includes */
/* #region stl */
/*<stl>*/
# include <bits/stdc++.h>
# include <sys/types.h>
# include <unistd.h>
using namespace std;
/*</stl>*/
/* #endregion */
/* #region template/IncludeSTL.hpp*/
/**
* @file IncludeSTL.hpp
* @author btk
* @brief include
* @version 0.1
* @date 2019-07-21
*
* @copyright Copyright (c) 2019
*
*/
/*<head>*/
# pragma once
/*</head>*/
/*<stl>*/
# include <bits/stdc++.h>
# include <sys/types.h>
# include <unistd.h>
using namespace std;
/*</stl>*/
/* #endregion */
/* #region template/Macro.hpp*/
/**
* @file Macro.hpp
* @author btk
* @brief LL
* @version 0.1
* @date 2019-07-13
*
* @copyright Copyright (c) 2019
*
*/
//! LL
using LL = long long;
/**
* @def DEBUG
* @brief if if(0)
*/
/*</head>*/
# ifdef BTK
# define DEBUG if (1)
# else
# ifdef CIN_ONLY
# define FAST_IO
# endif
# define DEBUG if (0)
# endif
/**
* @def ALL(v)
* @brief
* ALL
*/
# define ALL(v) (v).begin(), (v).end()
/**
* @def REC(ret, ...)
* @brief
*
*/
# define REC(ret, ...) std::function<ret(__VA_ARGS__)>
/**
* @def VAR_NAME(var)
* @brief
*/
# define VAR_NAME(var) # var
/**
* @brief
* range使
*/
template <typename T>
inline T& unused_var(T& v) {
return v;
}
/* #endregion */
/* #region template/IO.hpp*/
/**
* @file IO.hpp
* @author btk
* @brief cin
* @version 0.1
* @date 2019-07-13
*
* @copyright Copyright (c) 2019
*/
/**
* @brief
*/
struct cww {
/**
* @brief Construct a new cww::cww object
* @details
* CIN_ONLYsubmitcinscanf
* DECIMAL_DIGITSdouble
*/
cww() {
# ifdef FAST_IO
ios::sync_with_stdio(false);
cin.tie(0);
# endif
# ifdef DECIMAL_DIGITS
cout << fixed;
cout << setprecision(DECIMAL_DIGITS);
# endif
}
};
//!
cww star;
/**
* @brief
* vectorcin
* @tparam T
* @param is
* @param v
* @return istream&
*/
template <typename T>
std::istream& operator>>(std::istream& is, std::vector<T>& v) {
for (auto& it : v) is >> it;
return is;
}
/* #endregion */
/* #region template/Loop.hpp*/
/**
* @file Loop.hpp
* @author btk
* @brief range
* @version 0.1
* @date 2019-07-13
*
* @copyright Copyright (c) 2019
*
*/
/**
* @brief
* range
* @details
* [bg,ed)
* @see range
*/
class reverse_range {
private:
struct I {
int x;
int operator*() { return x - 1; }
bool operator!=(I& lhs) { return x > lhs.x; }
void operator++() { --x; }
};
I i, n;
public:
/**
* @brief Construct a new reverse range object
*
* @param n
*/
reverse_range(int n) : i({0}), n({n}) {}
/**
* @brief Construct a new reverse range object
*
* @param i
* @param n
*/
reverse_range(int i, int n) : i({i}), n({n}) {}
/**
* @brief
* begin iterator
* @return I&
*/
I& begin() { return n; }
/**
* @brief
* end iterator
* @return I&
*/
I& end() { return i; }
};
/**
* @brief
* python range-based for
* @details
* [bg,ed)
* ! (reverse_range)
* O(1)
* 使unused_var使
*/
class range {
private:
struct I {
int x;
int operator*() { return x; }
bool operator!=(I& lhs) { return x < lhs.x; }
void operator++() { ++x; }
};
I i, n;
public:
/**
* @brief Construct a new range object
*
* @param n
*/
range(int n) : i({0}), n({n}) {}
/**
* @brief Construct a new range object
*
* @param i
* @param n
*/
range(int i, int n) : i({i}), n({n}) {}
/**
* @brief
* begin iterator
* @return I&
*/
I& begin() { return i; }
/**
* @brief
* end iterator
* @return I&
*/
I& end() { return n; }
/**
* @brief
* range(reverse_ranges)
* @return reverse_range
*/
reverse_range operator!() { return reverse_range(*i, *n); }
};
/* #endregion */
/* #region template/MinMaxOperation.hpp*/
/**
* @file MinMaxOperation.hpp
* @author btk
* @brief
* @version 0.1
* @date 2019-07-04
*
* @copyright Copyright (c) 2019
*
*/
/**
* @brief 2
*
* @tparam T
*/
template <typename T>
struct min_op {
/**
* @brief
*
* @param l
* @param r
* @return T
*/
static T exec(const T l, const T r) { return l < r ? l : r; }
};
/**
* @brief 2
*
* @tparam T
*/
template <typename T>
struct max_op {
/**
* @brief
*
* @param l
* @param r
* @return T
*/
static T exec(const T l, const T r) { return l > r ? l : r; }
};
/**
* @brief
*
* @tparam F
* @tparam T
* @param v
* @return T
*/
template <typename F, typename T>
inline T multi_op(T&& v) {
return v;
}
/**
* @brief
*
* @tparam F
* @tparam T
* @tparam Ts
* @param head
* @param tail
* @return T
*/
template <typename F, typename T, typename... Ts>
inline T multi_op(const T head, Ts&&... tail) {
return F::exec(head, multi_op<F>(tail...));
}
/**
* @brief
* @see multi_op
* @tparam T
* @tparam Ts
* @param head
* @param tail
* @return T
*/
template <typename T, typename... Ts>
inline T multi_min(T&& head, Ts&&... tail) {
return multi_op<min_op<T>>(head, tail...);
}
/**
* @brief
* @see multi_op
* @tparam T
* @tparam Ts
* @param head
* @param tail
* @return T
*/
template <typename T, typename... Ts>
inline T multi_max(T&& head, Ts&&... tail) {
return multi_op<max_op<T>>(head, tail...);
}
/**
* @brief
* ·F
* @tparam F
* @tparam T
* @tparam Ts
* @param target
* @param candidates
* @return true
* @return false
*/
template <typename F, typename T, typename... Ts>
inline bool ch_op(T& target, Ts&&... candidates) {
const T old = target;
target = multi_op<F>(target, candidates...);
return old != target;
}
/**
* @brief change min
* @tparam T
* @param target
* @param candidates
* @return true
*/
template <typename T, typename... Ts>
inline bool chmin(T& target, Ts&&... candidates) {
return ch_op<min_op<T>>(target, candidates...);
}
/**
* @brief chminmax
* @see chmin
* @tparam T
* @param target
* @param candidates
* @return true
*/
template <typename T, typename... Ts>
inline bool chmax(T& target, Ts&&... candidates) {
return ch_op<max_op<T>>(target, candidates...);
}
/* #endregion */
/* #region template/Random.hpp*/
/**
* @file Random.hpp
* @author btk
* @brief
* @version 0.1
* @date 2019-07-13
* @copyright Copyright (c) 2019
*/
//! ID
const pid_t pid = getpid();
/**
* @brief XorShift32
*/
class XorShift32 {
private:
//! XorShift
unsigned value;
/**
* @brief XorShift32 value
*/
inline void update() {
value = value ^ (value << 13);
value = value ^ (value >> 17);
value = value ^ (value << 5);
}
/**
* @brief
* @return unsigned value
*/
inline unsigned get() {
unsigned v = value;
update();
return v;
}
public:
/**
* @brief [0, 2^bit)
* @tparam 31
* @return int
*/
template <int bit = 31>
inline int next_int() {
return (int)(get() >> (32 - bit));
}
/**
* @brief [-2^bit,2^bit)
* @tparam 31
* @return int
*/
template <int bit = 31>
inline int next_signed() {
unsigned v = get();
return (int)((v >> (31 - bit)) - (1 << (bit)));
}
/**
* @brief next_int
* @tparam 31
* @return int
*/
template <int bit = 31>
inline int range_max() {
return (int)((1u << bit) - 1);
};
/**
* @brief Construct a new XorShift32 object
* @param seed
* @details valueXorShift32
*/
XorShift32(const unsigned seed) {
value = seed;
update();
}
/**
* @brief Construct a new XorShift 32 object
* @details IDXorShift32
*/
XorShift32() : XorShift32(pid) {}
};
/* #endregion */
/* #region Template.hpp*/
/**
* @file Template.hpp
* @brief
* @author btk15049
* @date 2019/05/02
*/
/* #endregion */
/* #endregion */
/*</body>*/
#endif
typedef vector<int> V;
typedef vector<V> Graph;
int a[112345];
int b[112345];
LL c[112345];
namespace LCA {
/*
use doubling
- build : O(nlogn)
- query : O(logn)
*/
constexpr int BUF = 112345;
constexpr int LOG = 20; // LOG >= log(BUF)
int pp[LOG][BUF];
int *p = pp[0];
int depth[BUF];
// cost[v]=v
LL cost[BUF];
void dfs(int v, int q, Graph &g) {
for (int e : g[v]) {
int u = v ^ a[e] ^ b[e];
if (u == q) continue;
depth[u] = depth[v] + 1;
cost[u] = cost[v] + c[e];
p[u] = v;
dfs(u, v, g);
}
}
// lca
void build(Graph &g, int root = 0) {
int n = g.size();
for (int i = 0; i < n; i++) {
pp[0][i] = -1;
}
depth[root] = 0;
dfs(root, root, g);
for (int k = 0, f = 1; f; k++) {
f = 0;
for (int i = 0; i < n; i++) {
if (pp[k][i] < 0)
pp[k + 1][i] = -1;
else {
pp[k + 1][i] = pp[k][pp[k][i]];
f = 1;
}
}
}
}
inline int lca(int u, int v) {
if (depth[u] > depth[v]) swap(u, v);
for (int k = 0, d; (d = depth[v] - depth[u]); k++) {
if ((d >> k) & 1) {
v = pp[k][v];
}
}
if (u == v) return v;
for (int k = LOG - 1; k >= 0; k--) {
if (pp[k][u] != pp[k][v]) {
u = pp[k][u];
v = pp[k][v];
}
}
return pp[0][u];
}
inline int dist(int a, int b) {
int c = lca(a, b);
return depth[a] + depth[b] - 2 * depth[c];
}
inline LL sa(int a, int b) {
int c = lca(a, b);
return cost[a] + cost[b] - 2 * cost[c];
}
inline int lca(int a, int b, int c) {
int d = lca(a, b);
int e = lca(b, c);
int f = lca(c, a);
int dd = dist(d, a) + dist(d, b) + dist(d, c);
int ee = dist(e, a) + dist(e, b) + dist(e, c);
int ff = dist(f, a) + dist(f, b) + dist(f, c);
vector<pair<int, int>> v = {{dd, d}, {ee, e}, {ff, f}};
return min_element(v.begin(), v.end())->second;
}
} // namespace LCA
int main() {
/* write here */
int N;
cin >> N;
Graph g(N);
for (int i : range(N - 1)) {
cin >> a[i] >> b[i] >> c[i];
g[a[i]].push_back(i);
g[b[i]].push_back(i);
}
LCA::build(g);
int Q;
cin >> Q;
for (int i : range(Q)) {
int x, y, z;
cin >> x >> y >> z;
int p = LCA::lca(x, y, z);
cerr << p << endl;
cout << LCA::sa(p, x) + LCA::sa(p, y) + LCA::sa(p, z) << endl;
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0