結果

問題 No.900 aδδitivee
ユーザー btkbtk
提出日時 2019-10-04 22:11:25
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 20,476 bytes
コンパイル時間 2,621 ms
コンパイル使用メモリ 208,808 KB
最終ジャッジ日時 2025-01-07 20:35:20
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 19 TLE * 8
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:35:13: warning: #pragma once in main file
   35 | #    pragma once
      |             ^~~~

ソースコード

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

// https://yukicoder.me/problems/no/900
#define CIN_ONLY
#define DECIMAL_DIGITS 10
#define STATIC_MOD 1e9 + 7
#ifdef BTK
/*<head>*/
# include "Template.hpp"
# include "graph/Tree.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 */
/* #region graph/Graph.hpp*/
/**
* @file Graph.hpp
* @brief
* @author btk15049
* @date 2019/03/11
* @details
* verify: WUPC C
*/
/**
* @brief
* @details
*
* Graph使:
* - id,a,b
* - versusOK
*/
struct Edge {
//! id
int id;
//!
int a;
//!
int b;
/**
* @brief Construct a new Edge object
* @param id
* @param a
* @param b
*/
Edge(int id = 0, int a = 0, int b = 0) : id(id), a(a), b(b) {}
/**
* @brief v
* @param v
* @return int v
*/
inline int versus(const int v) const { return a ^ b ^ v; }
};
/**
* @brief
* @details
Graph使:
- id,a,b
- versusOK
*/
template <typename COST_TYPE>
struct WeightedEdge {
//! id
int id;
//!
int a;
//!
int b;
//!
COST_TYPE cost;
/**
* @brief Construct a new Weighted Edge object
*
* @param id
* @param a
* @param b
* @param cost
*/
WeightedEdge(int id = 0, int a = 0, int b = 0, int cost = 0)
: id(id), a(a), b(b), cost(cost) {}
/**
* @brief v
* @param v
* @return int v
*/
inline int versus(const int v) const { return a ^ b ^ v; }
};
/**
* @brief
* @tparam E=Edge
* @details 0-indexed使
*/
template <typename E = Edge>
class Graph {
private:
//!
std::vector<E> edges;
//!
std::vector<std::vector<int>> g;
public:
/**
* @brief Construct a new Graph object
* @param reserved_vertex_size vector
* @param reserved_edge_size vector
*/
Graph(int reserved_vertex_size = 1, int reserved_edge_size = -1) {
g.reserve(reserved_vertex_size);
edges.reserve(std::max(reserved_vertex_size, reserved_edge_size));
}
/**
* @brief
* @return int
*/
inline int size() { return g.size(); }
/**
* @brief v
* @param v
* @return int
*/
inline int degree(const int v) { return g[v].size(); }
/**
* @brief
* @return int
*/
inline int degree() { return edges.size(); }
/**
* @brief
*
* @return int
*/
inline void resize(const int n) { g.resize(n); }
/**
* @brief ""(a,b)
* @param a
* @param b
* @param params
* @details paramsemplace_backOK
*/
template <typename... Ts>
inline void add_edge(int a, int b, Ts&&... params) {
const int id = edges.size();
if ((int)g.size() <= std::max(a, b)) {
g.resize(std::max(a, b) + 1);
}
g[a].emplace_back(id);
g[b].emplace_back(id);
edges.emplace_back(id, a, b, std::forward<Ts>(params)...);
}
/**
* @brief ""E
* @details paramsemplace_backOK
*/
/**
* @brief id
* @param e
*/
inline void add_edge(E e) {
e.id = edges.size();
if ((int)g.size() <= max(e.a, e.b)) {
g.resize(max(e.a, e.b) + 1);
}
g[e.a].emplace_back(e.id);
g[e.b].emplace_back(e.id);
edges.emplace_back(e);
}
/**
* @brief ""(a,b)
* @param a
* @param b
* @param params
* @details paramsemplace_backOK
*/
template <typename... Ts>
inline void add_arc(int a, int b, Ts&&... params) {
const int id = edges.size();
if ((int)g.size() <= std::max(a, b)) {
g.resize(std::max(a, b) + 1);
}
g[a].emplace_back(id);
edges.emplace_back(id, a, b, std::forward<Ts>(params)...);
}
/**
* @brief id
* @param e
*/
inline void add_arc(E e) {
e.id = edges.size();
if ((int)g.size() <= std::max(e.a, e.b)) {
g.resize(std::max(e.a, e.b) + 1);
}
g[e.a].emplace_back(e.id);
edges.emplace_back(e);
}
/**
* @brief v
* @param v int
* @return vector<int>
*/
inline std::vector<int> Ns(const int v) {
std::vector<int> ns(g[v].size());
for (int i = 0; i < degree(v); i++) {
ns[i] = edges[g[v][i]].versus(v);
}
return ns;
}
/**
* @brief v
* @param v int
* @return vector<int>
*/
inline const std::vector<int>& operator[](const int v) { return g[v]; }
/**
* @brief
* @param edge_id
* @return E&
*/
inline E& i2e(const int edge_id) { return edges[edge_id]; }
};
/* #endregion */
/* #region graph/Tree.hpp*/
/**
* @file Tree.hpp
* @brief
* @author btk15049
* @date 2019/05/07
* @details
* verify:
*/
/**
* @brief
* @tparam E=Edge
* @details 0-indexed使
* @see Graph
*/
template <typename E = Edge>
class Forest : public Graph<E> {
private:
using Graph<E>::add_edge;
//!
std::vector<int> roots;
/**
* @brief
* DFS
*/
void build_tree(Graph<E>& g, const int v, std::vector<bool>& used) {
used[v] = true;
for (int edge_id : g[v]) {
auto e = g.i2e(edge_id);
const int u = e.versus(v);
if (used[u]) continue;
e.a = v;
e.b = u;
this->add_arc(e);
build_tree(g, u, used);
}
}
public:
/**
* @brief
*
* @see Graph::Graph()
*/
Forest(Graph<E>& g, const int loop_begin_vtx = 0)
: Graph<E>(g.size(), g.size() - 1) {
this->resize(g.size());
std::vector<bool> used(g.size());
for (int v : range(loop_begin_vtx, g.size() + loop_begin_vtx)) {
v = v % g.size();
if (used[v] == false) {
build_tree(g, v, used);
roots.push_back(v);
}
}
}
/**
* @brief Get the roots object
* @return vector<int>
*/
std::vector<int> get_roots() { return roots; }
};
/**
* @brief
* ""
* @tparam Edge
*/
template <typename E = Edge>
class Tree : public Forest<E> {
private:
using Forest<E>::get_roots;
//!
int root;
public:
/**
* @brief Construct a new Tree object
*
* @param g
* @param root
*/
Tree(Graph<E>& g, const int root = 0) : Forest<E>(g, root), root(root) {}
/**
* @brief Get the root object
*
* @return int
*/
inline int get_root() { return root; }
};
/* #endregion */
/* #endregion */
/*</body>*/
#endif
constexpr int MAX_NQ = 2e5;
int N, Q;
Graph<WeightedEdge<LL>> g(MAX_NQ, MAX_NQ);
using P = pair<int, int>;
int dep[MAX_NQ];
void euler_tour(int v, vector<P> &seg, int &cnt) {
int l = cnt++;
for (auto &u : g.Ns(v)) {
dep[u] = dep[v] + 1;
euler_tour(u, seg, cnt);
}
int r = cnt;
seg[v] = {l, r};
}
LL cost[212345];
vector<int> vs;
vector<LL> cs;
LL lazy[MAX_NQ];
LL ad[MAX_NQ];
void _sync(int v) {
cost[v] += lazy[v];
for (int u : g.Ns(v)) {
lazy[u] += lazy[v];
lazy[u] += ad[v];
ad[u] += ad[v];
_sync(u);
}
lazy[v] = 0;
ad[v] = 0;
}
void sync() {
while (!vs.empty()) {
ad[vs.back()] += cs.back();
vs.pop_back();
cs.pop_back();
}
_sync(0);
}
inline LL calc(const LL w, const LL dif) { return w * dif; }
int main() {
cin >> N;
// bit.get(v) == 0-v
for (int i : range(N - 1)) {
int a, b;
LL c;
cin >> a >> b >> c;
g.add_arc(a, b, c);
lazy[b] += c;
}
sync();
cin >> Q;
vector<P> seg(N);
{
int id = 0;
dep[0] = 0;
euler_tour(0, seg, id);
}
for (int i : range(Q)) {
int type;
cin >> type;
if (type == 1) {
int v;
LL w;
cin >> v >> w;
vs.push_back(v);
cs.push_back(w);
}
else {
int v;
cin >> v;
LL ret = cost[v];
for (int j : range(vs.size())) {
if (seg[vs[j]].first <= seg[v].first
&& seg[v].second <= seg[vs[j]].second) {
ret += calc(cs[j], dep[v] - dep[vs[j]]);
}
}
cout << ret << endl;
}
if (vs.size() >= 300) {
sync();
}
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0