結果
問題 | No.1295 木と駒 |
ユーザー |
![]() |
提出日時 | 2023-02-06 00:09:11 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 74 ms / 2,000 ms |
コード長 | 23,952 bytes |
コンパイル時間 | 4,701 ms |
コンパイル使用メモリ | 285,276 KB |
最終ジャッジ日時 | 2025-02-10 11:17:55 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 48 |
ソースコード
#include <bits/stdc++.h>// clang-format offstd::ostream&operator<<(std::ostream&os,std::int8_t x){return os<<(int)x;}std::ostream&operator<<(std::ostream&os,std::uint8_t x){return os<<(int)x;}std::ostream&operator<<(std::ostream&os,const __int128_t &v){if(!v)os<<"0";__int128_t tmp=v<0?(os<<"-",-v):v;std::string s;while(tmp)s+='0'+(tmp%10),tmp/=10;return std::reverse(s.begin(),s.end()),os<<s;}std::ostream&operator<<(std::ostream&os,const __uint128_t &v){if(!v)os<<"0";__uint128_t tmp=v;std::string s;while(tmp)s+='0'+(tmp%10),tmp/=10;returnstd::reverse(s.begin(),s.end()),os<<s;}#define checkpoint() (void(0))#define debug(x) (void(0))#define debugArray(x,n) (void(0))#define debugMatrix(x,h,w) (void(0))// clang-format on#ifdef __LOCAL// clang-format off#undef checkpoint#undef debug#undef debugArray#undef debugMatrixtemplate<class T, class U>std::ostream &operator<<(std::ostream&os,const std::pair<T,U>&x){return os<<"("<<x.first<<", "<<x.second<<")";}template<typename T>std::ostream &operator<<(std::ostream&os,const std::vector<T>&vec){os<<'[';for(int _=0,__= vec.size();_<__;++_)os<<(_ ?", ":"")<<vec[_];return os<<']';}template<typename T>std::ostream &operator<<(std::ostream&os,const std::set<T>&s){os<<'{';int _=0;for(const auto &x:s)os<<(_++ ? ", " : "")<<x;return os << '}';}template<typename T,std::size_t _Nm>std::ostream&operator<<(std::ostream &os,const std::array<T, _Nm> &arr) {os<<'['<<arr[0];for(std::size_t _=1;_<_Nm;++_)os<<", "<<arr[_];return os<<']';}template<class Tup,std::size_t... I>void print(std::ostream&os,const Tup &x,std::index_sequence<I...>){(void)(int[]){(os<<std::get<I>(x)<<", ",0)...};}template<class... Args>std::ostream &operator<<(std::ostream&os,const std::tuple<Args...> &x) {static constexpr std::size_t N = sizeof...(Args);os<<"(";if constexpr(N>=2)print(os,x,std::make_index_sequence<N-1>());return os<<std::get<N-1>(x)<<")";}const std::string COLOR_RESET="\033[0m",BRIGHT_GREEN="\033[1;32m",BRIGHT_RED="\033[1;31m",BRIGHT_CYAN="\033[1;36m",NORMAL_CROSSED="\033[0;9;37m",ITALIC="\033[3m",BOLD="\033[1m",RED_BACKGROUND="\033[1;41m",NORMAL_FAINT="\033[0;2m";#define func_LINE_FILE NORMAL_FAINT<<" in "<<BOLD<<__func__<<NORMAL_FAINT<<ITALIC<<" (L"<<__LINE__<<") "<< __FILE__<<COLOR_RESET#define checkpoint() std::cerr<<BRIGHT_RED<<"< check point! >"<<func_LINE_FILE<<'\n'#define debug(x) std::cerr<<BRIGHT_CYAN<<#x<<COLOR_RESET<<" = "<<(x)<<func_LINE_FILE<<'\n'#define debugArray(x, n) do{std::cerr<<BRIGHT_CYAN<<#x<<COLOR_RESET<<" = ["<<x[0];for(int _=1;_<(int)(n);++_)std::cerr<<", "<<x[_];std::cerr<<"]"<<func_LINE_FILE<<'\n';}while(0)#define debugMatrix(x, h, w) do{std::cerr<<BRIGHT_CYAN<<#x<<"\n"<<COLOR_RESET<<"= ";for(int _=0;(_)<(int)(h);++_){std::cerr<<((_?" [":"[["));for(int __=0;__<(int)(w);++__)std::cerr<<((__?", ":""))<<x[_][__];std::cerr<<"]"<<(_+1==(int)(h)?"]":",\n");}std::cerr<<func_LINE_FILE<<'\n';}while(0)#endif// clang-format ontemplate <class Int> constexpr inline Int mod_inv(Int a, Int mod) {static_assert(std::is_signed_v<Int>);Int x= 1, y= 0, b= mod;for (Int q= 0, z= 0, c= 0; b;) z= x, c= a, x= y, y= z - y * (q= a / b), a= b, b= c - b * q;return assert(a == 1), x < 0 ? mod - (-x) % mod : x % mod;}namespace math_internal {using namespace std;using u8= uint8_t;using u32= uint32_t;using u64= uint64_t;using i64= int64_t;using u128= __uint128_t;#define CE constexpr#define IL inline#define NORM \if (n >= mod) n-= mod; \return n#define PLUS(U, M) \CE IL U plus(U l, U r) const { \if (l+= r; l >= M) l-= M; \return l; \}#define DIFF(U, C, M) \CE IL U diff(U l, U r) const { \if (l-= r; l >> C) l+= M; \return l; \}#define SGN(U) \static CE IL U set(U n) { return n; } \static CE IL U get(U n) { return n; } \static CE IL U norm(U n) { return n; }template <class u_t, class du_t, u8 B, u8 A> struct MP_Mo {const u_t mod;CE MP_Mo(): mod(0), iv(0), r2(0) {}CE MP_Mo(u_t m): mod(m), iv(inv(m)), r2(-du_t(mod) % mod) {}CE IL u_t mul(u_t l, u_t r) const { return reduce(du_t(l) * r); }PLUS(u_t, mod << 1)DIFF(u_t, A, mod << 1)CE IL u_t set(u_t n) const { return mul(n, r2); }CE IL u_t get(u_t n) const {n= reduce(n);NORM;}CE IL u_t norm(u_t n) const { NORM; }private:const u_t iv, r2;static CE u_t inv(u_t n, int e= 6, u_t x= 1) { return e ? inv(n, e - 1, x * (2 - x * n)) : x; }CE IL u_t reduce(const du_t &w) const { return u_t(w >> B) + mod - ((du_t(u_t(w) * iv) * mod) >> B); }};struct MP_Na {const u32 mod;CE MP_Na(): mod(0){};CE MP_Na(u32 m): mod(m) {}CE IL u32 mul(u32 l, u32 r) const { return u64(l) * r % mod; }PLUS(u32, mod) DIFF(u32, 31, mod) SGN(u32)};struct MP_Br { // mod < 2^31const u32 mod;CE MP_Br(): mod(0), s(0), x(0) {}CE MP_Br(u32 m): mod(m), s(__lg(m - 1) + 64), x(((u128(1) << s) + m - 1) / m) {}CE IL u32 mul(u32 l, u32 r) const { return rem(u64(l) * r); }PLUS(u32, mod) DIFF(u32, 31, mod) SGN(u32) private: const u8 s;const u64 x;CE IL u64 quo(u64 n) const { return (u128(x) * n) >> s; }CE IL u32 rem(u64 n) const { return n - quo(n) * mod; }};struct MP_Br2 { // 2^20 < mod <= 2^41const u64 mod;CE MP_Br2(): mod(0), x(0) {}CE MP_Br2(u64 m): mod(m), x((u128(1) << 84) / m) {}CE IL u64 mul(u64 l, u64 r) const { return rem(u128(l) * r); }PLUS(u64, mod << 1)DIFF(u64, 63, mod << 1)static CE IL u64 set(u64 n) { return n; }CE IL u64 get(u64 n) const { NORM; }CE IL u64 norm(u64 n) const { NORM; }private:const u64 x;CE IL u128 quo(const u128 &n) const { return (n * x) >> 84; }CE IL u64 rem(const u128 &n) const { return n - quo(n) * mod; }};struct MP_D2B1 {const u64 mod;CE MP_D2B1(): mod(0), s(0), d(0), v(0) {}CE MP_D2B1(u64 m): mod(m), s(__builtin_clzll(m)), d(m << s), v(u128(-1) / d) {}CE IL u64 mul(u64 l, u64 r) const { return rem((u128(l) * r) << s) >> s; }PLUS(u64, mod) DIFF(u64, 63, mod) SGN(u64) private: CE IL u64 rem(const u128 &u) const {u128 q= (u >> 64) * v + u;u64 r= u64(u) - (q >> 64) * d - d;if (r > u64(q)) r+= d;if (r >= d) r-= d;return r;}const u8 s;const u64 d, v;};template <class u_t, class MP> CE u_t pow(u_t x, u64 k, const MP &md) {for (u_t ret= md.set(1);; x= md.mul(x, x))if (k & 1 ? ret= md.mul(ret, x) : 0; !(k>>= 1)) return ret;}#undef NORM#undef PLUS#undef DIFF#undef SGN#undef CE}namespace math_internal {#define CE constexprstruct m_b {};struct s_b: m_b {};template <class mod_t> CE bool is_modint_v= is_base_of_v<m_b, mod_t>;template <class mod_t> CE bool is_staticmodint_v= is_base_of_v<s_b, mod_t>;template <class MP, u64 MOD> struct SB: s_b {protected:static CE MP md= MP(MOD);};template <class Int, class U, class B> struct MInt: public B {using Uint= U;static CE inline auto mod() { return B::md.mod; }CE MInt(): x(0) {}CE MInt(const MInt &r): x(r.x) {}template <class T, enable_if_t<is_modint_v<T>, nullptr_t> = nullptr> CE MInt(T v): x(B::md.set(v.val() % B::md.mod)) {}template <class T, enable_if_t<is_convertible_v<T, __int128_t>, nullptr_t> = nullptr> CE MInt(T n): x(B::md.set((n < 0 ? B::md.mod - (-n) % B::md.mod : n % B::md.mod))) {}CE MInt operator-() const { return MInt() - *this; }#define FUNC(name, op) \CE MInt name const { \MInt ret; \ret.x= op; \return ret; \}FUNC(operator+(const MInt &r), B::md.plus(x, r.x))FUNC(operator-(const MInt &r), B::md.diff(x, r.x))FUNC(operator*(const MInt &r), B::md.mul(x, r.x))FUNC(pow(u64 k), math_internal::pow(x, k, B::md))#undef FUNCCE MInt operator/(const MInt &r) const { return *this * r.inv(); }CE MInt &operator+=(const MInt &r) { return *this= *this + r; }CE MInt &operator-=(const MInt &r) { return *this= *this - r; }CE MInt &operator*=(const MInt &r) { return *this= *this * r; }CE MInt &operator/=(const MInt &r) { return *this= *this / r; }CE bool operator==(const MInt &r) const { return B::md.norm(x) == B::md.norm(r.x); }CE bool operator!=(const MInt &r) const { return !(*this == r); }CE bool operator<(const MInt &r) const { return B::md.norm(x) < B::md.norm(r.x); }CE inline MInt inv() const { return mod_inv<Int>(val(), B::md.mod); }CE inline Uint val() const { return B::md.get(x); }friend ostream &operator<<(ostream &os, const MInt &r) { return os << r.val(); }friend istream &operator>>(istream &is, MInt &r) {i64 v;return is >> v, r= MInt(v), is;}private:Uint x;};template <u64 MOD> using ModInt= conditional_t < (MOD < (1 << 30)) & MOD, MInt<int, u32, SB<MP_Mo<u32, u64, 32, 31>, MOD>>, conditional_t < (MOD <(1ull << 62)) & MOD, MInt<i64, u64, SB<MP_Mo<u64, u128, 64, 63>, MOD>>, conditional_t<MOD<(1u << 31), MInt<int, u32, SB<MP_Na, MOD>>,conditional_t<MOD<(1ull << 32), MInt<i64, u32, SB<MP_Na, MOD>>, conditional_t<MOD <= (1ull << 41), MInt<i64, u64, SB<MP_Br2, MOD>>, MInt<i64, u64, SB<MP_D2B1, MOD>>>>>>>;#undef CE}using math_internal::ModInt, math_internal::is_modint_v, math_internal::is_staticmodint_v;template <class mod_t, size_t LM> mod_t get_inv(int n) {static_assert(is_modint_v<mod_t>);static const auto m= mod_t::mod();static mod_t dat[LM];static int l= 1;if (l == 1) dat[l++]= 1;while (l <= n) dat[l++]= dat[m % l] * (m - m / l);return dat[n];}template <class Cost= void> class Tree {template <class D, class T> struct Edge_B {int to;T cost;};template <class D> struct Edge_B<D, void> { int to; };using Edge= Edge_B<void, Cost>;std::vector<std::vector<Edge>> adj;std::vector<int> P, PP, D, I, L, R;public:Tree(int n): adj(n) {}template <class T= Cost, std::enable_if_t<std::is_same_v<T, void>, std::nullptr_t> = nullptr> void add_edge(int u, int v) { adj[u].emplace_back(Edge{v}), adj[v].emplace_back(Edge{u}); }template <class T, std::enable_if_t<std::is_convertible_v<T, Cost>, std::nullptr_t> = nullptr> void add_edge(int u, int v, T c) { adj[u].emplace_back(Edge{v, c}), adj[v].emplace_back(Edge{u, c}); }template <class T, class U, std::enable_if_t<std::conjunction_v<std::is_convertible<T, Cost>, std::is_convertible<U, Cost>>, std::nullptr_t> =nullptr> void add_edge(int u, int v, T c, U d) /* c:u->v, d:v->u */ { adj[u].emplace_back(Edge{v, c}), adj[v].emplace_back(Edge{u, d}); }const std::vector<Edge> &operator[](int v) const { return adj[v]; }void build(int root= 0) {const int n= adj.size();P.assign(n, -2), I.reserve(n), PP.resize(n), std::iota(PP.begin(), PP.end(), 0), D.assign(n, 0), L.assign(n, 0), R.assign(n, 0);auto f= [&, i= 0, v= 0](int r) mutable {for (P[r]=-1, I.push_back(r); i < (int)I.size(); ++i)for (const Edge &e: adj[v= I[i]])if (P[v] != e.to) I.push_back(e.to), P[e.to]= v;};f(root);for (int r= 0; r < n; ++r)if (P[r] == -2) f(r);std::vector<int> Z(n, 1), nx(n, -1);for (int i= n, v; i--;) {if (P[v= I[i]] == -1) continue;if (Z[P[v]]+= Z[v]; nx[P[v]] == -1) nx[P[v]]= v;if (Z[nx[P[v]]] < Z[v]) nx[P[v]]= v;}for (int v: I)if (nx[v] != -1) PP[nx[v]]= v;for (int v: I)if (P[v] != -1) PP[v]= PP[PP[v]], D[v]= D[P[v]] + 1;for(int i=0;i<n;++i) L[I[i]]=i;for (int v: I) {int ir= R[v]= L[v] + Z[v];for (const Edge &e: adj[v])if (int u=e.to;u != P[v] && u != nx[v]) L[u]= ir-= Z[u];if (nx[v] != -1) L[nx[v]]= L[v] + 1;}for (int i= 0; i < n; ++i) I[L[i]]= i;}int size() const { return adj.size(); }bool builded()const{return L.size()==adj.size();}int depth(int v) const { return assert(builded()),D[v]; }int to_seq(int v) const { return assert(builded()),L[v]; }int to_node(int i) const { return assert(builded()),I[i]; }int parent(int v) const { return assert(builded()),P[v]; }int root(int v) const {for (assert(builded()),v= PP[v];; v= PP[P[v]])if (P[v] == -1) return v;}bool connected(int u, int v) const {return root(u)==root(v);}int lca(int u, int v) const {for (assert(builded());; v= P[PP[v]]) {if (L[u] > L[v]) std::swap(u, v);if (PP[u] == PP[v]) return u;}}int la(int v, int k) const {assert(builded()),assert(k <= D[v]);for (int u;; k-= L[v] - L[u] + 1, v= P[u])if (L[v] - k >= L[u= PP[v]]) return I[L[v] - k];}int jump(int u, int v, int k) const {if (assert(builded());u == v) return -1;if (k == 1) return in_subtree(v, u) ? la(v, D[v] - D[u] - 1) : P[u];int w= lca(u, v), d_uw= D[u] - D[w], d_vw= D[v] - D[w];return k > d_uw + d_vw ? -1 : k <= d_uw ? la(u, k) : la(v, d_uw + d_vw - k);}int dist(int u, int v) const { return assert(builded()),depth(u) + depth(v) - depth(lca(u, v)) * 2; }bool in_subtree(int u, int v) /* u is in v */ const { return assert(builded()),L[v] <= L[u] && L[u] < R[v]; }int subtree_size(int v) const { return assert(builded()),R[v] - L[v]; }std::array<int, 2> subtree(int v) /* half-open interval */ const { return assert(builded()),std::array{L[v], R[v]}; }template <bool edge= 0> std::vector<std::array<int, 2>> path(int u, int v) /* sequence of closed intervals */ const {assert(builded());std::vector<std::array<int, 2>> up, down;while (PP[u] != PP[v]) {if (L[u] < L[v]) down.emplace_back(std::array{L[PP[v]], L[v]}), v= P[PP[v]];else up.emplace_back(std::array{L[u], L[PP[u]]}), u= P[PP[u]];}if (L[u] < L[v]) down.emplace_back(std::array{L[u] + edge, L[v]});else if (L[v] + edge <= L[u]) up.emplace_back(std::array{L[u], L[v] + edge});return up.insert(up.end(), down.rbegin(), down.rend()), up;}};template <class T, class C> class ReRootingData {Tree<C> &tree;std::vector<T> dp1, dp2, dp;public:ReRootingData(Tree<C> &t,std::vector<T>& d1,std::vector<T>& d2,std::vector<T>& d):tree(t),dp1(d1),dp2(d2),dp(d){}T operator[](int v)const { return dp[v]; }auto begin() const { return dp.begin(); }auto end() const { return dp.end(); }const T& get(int root, int v)const{return root==v?dp[v]:tree.in_subtree(root,v)? dp2[tree.jump(v,root,1)]:dp1[v];}};template <class T, class U, class C, class F1, class F2, class F3>ReRootingData<T,C> rerooting(Tree<C> &t, const F1 &f_ee, const F2 &f_ve, const F3 &f_ev, const U &unit){const int n= t.size();std::vector<T> dp1(n), dp2(n), dp(n);for (int i= n; i--;) {int v= t.to_node(i);U sum= unit;for (const auto &e: t[v])if (int u=e.to;u != t.parent(v)) sum= f_ee(sum, f_ve(dp1[u], v, e));dp1[v]= f_ev(sum, v);}for (int i= 0; i < n; ++i) {int v= t.to_node(i), deg= t[v].size();std::vector<U> f(deg + 1), b(deg + 1);for (int j= 0; j < deg; ++j) {const auto &e= t[v][j];int u= e.to;f[j + 1]= f_ve(u == t.parent(v) ? dp2[v] : dp1[u],v, e);}f[0]= b[deg]= unit;for (int j= deg; j--;) b[j]= f_ee(f[j + 1], b[j + 1]);for (int j= 0; j < deg; ++j) f[j + 1]= f_ee(f[j], f[j + 1]);for (int j= 0; j < deg; ++j) {const auto &e= t[v][j];if (int u= e.to;u != t.parent(v)) dp2[u]= f_ev(f_ee(f[j], b[j + 1]), v);}dp[v]= f_ev(f[deg], v);}return ReRootingData<T,C>(t, dp1, dp2, dp);}using namespace std;namespace AOJGRL_5_A {// https://onlinejudge.u-aizu.ac.jp/courses/library/5/GRL/5/GRL_5_Asigned main() {cin.tie(0);ios::sync_with_stdio(0);int n;cin >> n;Tree<int> tree(n);for (int i= 0; i < n - 1; ++i) {int s, t, w;cin >> s >> t >> w;tree.add_edge(s, t, w);}tree.build();auto f_ee= [&](int l, int r) { return max(l, r); };auto f_ve= [&](int d, int,const auto &e) { return d + e.cost; };auto f_ev= [&](int d, int) { return d; };auto dp = rerooting<int>(tree,f_ee,f_ve,f_ev,0);cout << *max_element(dp.begin(), dp.end()) << '\n';return 0;}}namespace AOJ1595 {// https://onlinejudge.u-aizu.ac.jp/challenges/sources/UOA/UAPC/1595signed main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin >> N;Tree tree(N);for (int i= 0; i < N - 1; ++i) {int u, v;cin >> u >> v;tree.add_edge(--u,--v);}tree.build();auto f_ee= [&](int l, int r) { return max(l, r); };auto f_ve= [&](int d, int,auto) { return d + 1; };auto f_ev= [&](int d, int) { return d; };auto dp= rerooting<int>(tree,f_ee, f_ve, f_ev, 0);for (auto x: dp) cout << 2 * (N - 1) - x << '\n';return 0;}}namespace yukicoder768 {// https://yukicoder.me/problems/no/768signed main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin >> N;Tree tree(N);for (int i= 0; i < N - 1; ++i) {int u, v;cin >> u >> v;tree.add_edge(--u,--v);}tree.build();auto f_ee= [&](bool l, bool r) { return l | r; };auto f_ve= [&](bool d, int,auto) { return d; };auto f_ev= [&](bool d, int) { return !d; };auto dp= rerooting<bool>(tree, f_ee, f_ve, f_ev, false);vector<int> ans;for (int i= 0; i < N; ++i)if (dp[i]) ans.push_back(i + 1);cout << ans.size() << '\n';for (int x: ans) cout << x << '\n';return 0;}}namespace ABC222F {// https://atcoder.jp/contests/abc222/tasks/abc222_fsigned main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin >> N;Tree<long long> tree(N);for (int i= 0; i < N - 1; ++i) {int A, B, C;cin >> A >> B >> C;tree.add_edge(--A,--B,C);}tree.build();vector<long long> D(N);for (int i= 0; i < N; ++i) cin >> D[i];auto f_ee= [&](long long l, long long r) { return max(l, r); };auto f_ve= [&](long long d, int, const auto& e) { return max(d, D[e.to]) + e.cost; };auto f_ev= [&](long long d, int) { return d; };auto dp= rerooting<long long>(tree, f_ee, f_ve, f_ev, 0ll);for (long long x: dp) cout << x << '\n';return 0;}}namespace yukicoder1494 {// https://yukicoder.me/problems/no/1494signed main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin >> N;string S;cin >> S;int n= S.length();Tree<char> tree(N);for (int i= 0; i < N - 1; ++i) {int u, v;char c;cin >> u >> v >> c;tree.add_edge(--u,--v,c);}tree.build();using Data= vector<int>;auto f_ee= [&](const Data &l, const Data &r) {Data ret(n + 1);for (int i= 0; i <= n; ++i) ret[i]= max(l[i], r[i]);return ret;};auto f_ve= [&](Data d,int, const auto &e) {for (int i= n; i--;)if (S[i] == e.cost) d[i + 1]= max(d[i + 1], d[i] + 1);for (int i= 0; i < n; ++i) d[i + 1]= max(d[i + 1], d[i]);return d;};auto f_ev= [&](const Data &d, int) { return d; };auto dp= rerooting<Data>(tree, f_ee, f_ve, f_ev, Data(n + 1, 0));int ans= 0;for (const auto &v: dp) ans= max(ans, v[n]);cout << ans << '\n';return 0;}}namespace yukicoder1418 {// https://yukicoder.me/problems/no/1418signed main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin >> N;Tree tree(N);for (int i= 0; i < N - 1; ++i) {int A, B;cin >> A >> B;tree.add_edge(--A,--B);}tree.build();using Data= array<int, 2>;auto f_ee= [&](const Data &l, const Data &r) { return Data{l[0] + r[0], l[1] + r[1]}; };auto f_ve= [&](const Data &d, int,auto) { return d; };auto f_ev= [&](Data d, int) {++d[0], d[1]+= d[0];return d;};auto dp= rerooting<Data>(tree, f_ee, f_ve, f_ev, Data{0, 0});int ans= 0;for (const auto &x: dp) ans+= x[1];cout << ans << '\n';return 0;}}namespace yukicoder922 {// https://yukicoder.me/problems/no/922// 森signed main() {cin.tie(0);ios::sync_with_stdio(0);int N, M, Q;cin >> N >> M >> Q;Tree tree(N);for (int i= 0; i < M; ++i) {int u, v;cin >> u >> v;tree.add_edge(--u,--v);}tree.build();vector<int> cnt(N);int ans= 0;while (Q--) {int a, b;cin >> a >> b;--a, --b;if (tree.connected(a, b)) ans+= tree.dist(a, b);else ++cnt[a], ++cnt[b];}using Data= array<int, 2>;auto f_ee= [&](const Data &l, const Data &r) { return Data{l[0] + r[0], l[1] + r[1]}; };auto f_ve= [&](const Data &d, int, auto) { return Data{d[0], d[1] + d[0]}; };auto f_ev= [&](const Data &d, int v) { return Data{d[0] + cnt[v], d[1]}; };auto dp= rerooting<Data>(tree, f_ee, f_ve, f_ev, Data{0, 0});constexpr int INF= 1 << 30;vector<int> mi(N, INF);for (int i= 0; i < N; ++i) {int u= tree.root(i);mi[u]= min(mi[u], dp[i][1]);}for (int i= 0; i < N; ++i)if (mi[i] != INF) ans+= mi[i];cout << ans << '\n';return 0;}}namespace yukicoder1075 {// https://yukicoder.me/problems/no/1075signed main() {cin.tie(0);ios::sync_with_stdio(0);using Mint= ModInt<int(1e9 + 7)>;int N, K;cin >> N >> K;Tree tree(N);for (int i= 0; i < N - 1; ++i) {int a, b;cin >> a >> b;tree.add_edge(--a,--b);}tree.build();using Data= vector<Mint>;using DD= array<Data, 2>;auto f_ee= [&](const DD &l, const DD &r) {DD ret{Data(K), Data(K)};for (int i= 0; i < K; ++i) ret[0][i]= l[0][i] * r[0][i];for (int i= 0; i < K; ++i) ret[1][i]= l[1][i] * r[1][i];return ret;};auto f_ve= [&](DD d, int p, auto e) {if (p > e.to) {for (int i= K; --i;) d[1][i]= d[0][i - 1];d[1][0]= 0;}return d;};auto f_ev= [&](DD d, int) {for (int i= 1; i < K; ++i) d[0][i]+= d[0][i - 1];for (int i= 1; i < K; ++i) d[1][i]+= d[1][i - 1];return d;};auto dp= rerooting<DD>(tree, f_ee, f_ve, f_ev, DD{Data(K, 1), Data(K, 1)});Mint ans= 0;for (const auto &x: dp) ans+= x[1][K - 1];cout << ans << '\n';return 0;}}namespace yukicoder1124 {// https://yukicoder.me/problems/no/1124signed main() {cin.tie(0);ios::sync_with_stdio(0);using Mint= ModInt<int(1e9 + 7)>;int N;cin >> N;Tree tree(N);for (int i= 0; i < N - 1; ++i) {int A, B;cin >> A >> B;tree.add_edge(--A,--B);}tree.build();using Data= array<Mint, 2>;static constexpr Mint iv2= Mint(1) / 2;auto f_ee= [&](const Data &l, const Data &r) { return Data{l[0] + r[0], l[1] + l[0] * r[0] * 2 + r[1]}; };auto f_ve= [&](const Data &d, int, auto) { return Data{d[0] * iv2, d[1] * iv2}; };auto f_ev= [&](const Data &d, int) { return Data{d[0] + 1, d[1] + d[0] * 2 + 1}; };auto dp= rerooting<Data>(tree, f_ee, f_ve, f_ev, Data{0, 0});Mint ans= 0;for (const auto &x: dp) ans+= x[1];ans*= Mint(2).pow(N - 1);cout << ans << '\n';return 0;}}namespace yukicoder1153 {// https://yukicoder.me/problems/no/1153signed main() {cin.tie(0);ios::sync_with_stdio(0);int N, M;cin >> N >> M;int A[M];for (int i= 0; i < M; ++i) cin >> A[i], --A[i];Tree tree(N);for (int i= 0; i < N - 1; ++i) {int u, v;cin >> u >> v;tree.add_edge(--u,--v);}tree.build();auto mex= [](int v) -> int {for (int i= 0;; ++i)if (!((v>>i)&1)) return i;};auto f_ee= [&](int l, int r) { return l|r; };auto f_ve= [&](int g, int,auto) { return 1<<g; };auto f_ev= [&](int d, int) { return mex(d); };auto dp= rerooting<int>(tree, f_ee, f_ve, f_ev, 0);int sum= 0;for (int i= 0; i < M; ++i) sum^= dp[A[i]];if (sum) {for (int i= 0; i < M; ++i) {int v=A[i], g= dp[v], h=sum^g;if (h < g)for(auto e:tree[v])if(int u=e.to;dp.get(v,u) == h){cout<<i+1<<" "<<u+1<<'\n';return 0;}}} else cout << -1 << " " << -1 << '\n';return 0;}}namespace yukicoder1295{//https://yukicoder.me/problems/no/1295signed main() {cin.tie(0);ios::sync_with_stdio(0);int N;cin>>N;Tree tree(N);for(int i=0;i<N-1;++i){int a,b;cin>>a>>b;tree.add_edge(--a,--b);}tree.build();vector<int> ma(N),ma2(N),mi(N);for(int i=0;i<N;++i){vector<int> vs;for(auto e:tree[i])vs.push_back(e.to);sort(vs.begin(),vs.end());int n=vs.size();ma[i]=vs[n-1],mi[i]=vs[0];ma2[i]=n>1? vs[n-2]:-1;}auto f_ee=[&](int l,int r){return l+r;};auto f_ve=[&](int d,int p,auto e){if(d>=4||(d==3&&p!=ma[e.to]))return 4;if(d==0&&p==mi[e.to])return 0;if(e.to==ma[p]||e.to==mi[p])return 2;if(e.to==ma2[p])return 3;return 4;};auto f_ev=[&](int d,int){return d;};auto dp = rerooting<int>(tree,f_ee,f_ve,f_ev,0);for(auto x:dp){cout<<(x<=2? "Yes":"No")<<'\n';}return 0;}}signed main() {cin.tie(0);ios::sync_with_stdio(0);// AOJGRL_5_A::main();// AOJ1595::main();// yukicoder768::main();// ABC222F::main();// yukicoder1494::main();// yukicoder1418::main();// yukicoder922::main();// yukicoder1075::main();// yukicoder1124::main();// yukicoder1153::main();yukicoder1295::main();return 0;}