Advertisement
a_chn

Untitled

Jan 15th, 2024
2,153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <utility>
  4. #include <vector>
  5. #include <stack>
  6. #include <map>
  7. #include <queue>
  8. #include <set>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <functional>
  14. #include <cassert>
  15. #include <iomanip>
  16. #include <numeric>
  17. #include <bitset>
  18. #include <sstream>
  19. #include <chrono>
  20. #include <random>
  21.  
  22. #define ff first
  23. #define ss second
  24. #define ll long long
  25. #define ld long double
  26. #define PB push_back
  27. #define MP make_pair
  28. #define MT make_tuple
  29. #define EB emplace_back
  30. #define PoB pop_back
  31. #define LOG log2
  32. #define FOR(i,a,b) for (int i = (a); i < (b); ++i)
  33. #define F0R(i,a) FOR(i,0,a)
  34. #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
  35. #define R0F(i,a) ROF(i,0,a)
  36. #define fch(t, v) for (auto t : v)
  37. #define sz(x) int(x.size())
  38. #define rsz resize
  39. #define gp(x) vector<vector<x>>
  40. #define btree vector<pii>
  41. #define vll vector<ll>
  42. #define Max(a, b, c) max(max(a,b),c)
  43. #define fMax(a, b, c, d) max(Max(a, b, c), dp)
  44. #define Min(a, b, c) min(min(a,b),c)
  45. #define Mid(a, b, c) max(min(a, b), min(max(a, b), c))
  46. #define st(a) set<a>
  47. #define gr(x) greater<x>
  48. #define gi greater<int>
  49. #define all(x) (x).begin(),(x).end()
  50. #define tri(x) tuple<x,x,x>
  51. #define pil pair<int, long>
  52. #define ull unsigned long long
  53. #define eps 1e-9
  54. //#define debug(x) cout << '>' << #x << ':' << x << endl;
  55.  
  56. using namespace std;
  57.  
  58. void __print(int x) {cerr << x;}
  59. void __print(long x) {cerr << x;}
  60. void __print(long long x) {cerr << x;}
  61. void __print(unsigned x) {cerr << x;}
  62. void __print(unsigned long x) {cerr << x;}
  63. void __print(unsigned long long x) {cerr << x;}
  64. void __print(float x) {cerr << x;}
  65. void __print(double x) {cerr << x;}
  66. void __print(long double x) {cerr << x;}
  67. void __print(char x) {cerr << '\'' << x << '\'';}
  68. void __print(const char *x) {cerr << '\"' << x << '\"';}
  69. void __print(const string &x) {cerr << '\"' << x << '\"';}
  70. void __print(bool x) {cerr << (x ? "true" : "false");}
  71.  
  72. template<typename T, typename V>
  73. void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
  74. template<typename T>
  75. void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
  76. void _print() {cerr << "]\n";}
  77. template <typename T, typename... V>
  78. void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
  79. void println() {cerr << ">--------------------<" << endl;}
  80. void printm(vector<vector<int>>& mat) {
  81.     cerr << "matrix: " << endl;
  82.     for (int i = 0; i<(int)mat.size(); i++) {for (int j = 0; j<(int)mat[0].size(); j++) {cerr << mat[i][j] << " ";} cerr << endl;}
  83. }
  84.  
  85. #ifndef ONLINE_JUDGE
  86. #define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
  87. #else
  88. #define debug(x...)
  89. #endif
  90.  
  91. typedef pair<int, int> pii;
  92. typedef pair<ll, ll> pll;
  93. typedef vector<int> vi;
  94.  
  95. // templates
  96. template <class T> bool ckmin(T &a, const T &b) {return b<a ? a = b, 1 : 0;}
  97. template <class T> bool ckmax(T &a, const T &b) {return b>a ? a = b, 1 : 0;}
  98. mt19937_64 rng_ll(chrono::steady_clock::now().time_since_epoch().count());
  99. template <class T> using vc = vector<T>;
  100. template <class T> using p_q = priority_queue<T>;
  101. template <class T> using pqg = priority_queue<T, vc<T>, greater<T>>;
  102. int rng(int M) {return (int)(rng_ll()%M);}
  103.  
  104. constexpr int INF = (int)2e9;
  105. int MOD = 998244353;
  106. constexpr ll LL_INF = (ll)3e18;
  107. constexpr int mod = (int)1e9 + 7;
  108. constexpr ll inverse = 500000004LL; // inverse of 2 modulo 1e9 + 7
  109.  
  110. void setIO(const string& str) {
  111.     ios_base::sync_with_stdio(false);
  112.     cin.tie(nullptr);
  113.     if (str.empty()) return;
  114.     freopen((str + ".in").c_str(), "r", stdin);
  115.     freopen((str + ".out").c_str(), "w", stdout);
  116. }
  117.  
  118. int N, T;
  119. vc<vi> adj;
  120. vll a, dp, s, t, leaf, pd;
  121. vi contains;
  122.  
  123. struct LCA {
  124.     int N; // assuming ONE INDEXED
  125.     vector<vector<int>> adj, up;
  126.     int L = 20;
  127.     int timer = 0;
  128.     vector<int> tin, tout;
  129.     void dfs(int v, int par) { // par MUST BE EQUAL TO V at the start
  130.         tin[v] = timer++;
  131.         up[v][0] = par;
  132.         for (int i = 1; i <= L; ++i) up[v][i] = up[up[v][i-1]][i-1];
  133.         fch(u, adj[v]) if (u != par) dfs(u, v);
  134.         tout[v] = timer++;
  135.     }
  136.     LCA(int n, int root, const vc<vi>& trump) {
  137.         N = n;
  138.         adj = trump;
  139.         up.clear(), up.rsz(N+1, vi(L+1));
  140.         tin.clear(), tin.rsz(N+1), tout.clear(), tout.rsz(N+1);
  141.         timer = 0;
  142.         dfs(root, root);
  143.     }
  144.     bool bruh(int u, int v) { // this function checks if u is ancestor of v
  145.         return tin[u] <= tin[v] && tout[u] >= tout[v];
  146.     }
  147.     int lca(int u, int v) {
  148.         if (bruh(u, v)) return u;
  149.         if (bruh(v, u)) return v;
  150.         for (int i = L; i >= 0; --i) if (!bruh(up[u][i], v)) u = up[u][i];
  151.         return up[u][0];
  152.     }
  153. };
  154.  
  155. void dfs(int v) {
  156.     s[v] = a[v];
  157.     t[v] = 0;
  158.     fch(u, adj[v]) {
  159.         dfs(u);
  160.         t[v] += 2 + t[u];
  161.         s[v] += s[u];
  162.     }
  163.     sort(all(adj[v]), [&](const int& a, const int& b) {
  164.         return s[b] * (t[a] + 2) < (t[b] + 2) * s[a];
  165.     });
  166.     ll time = 0;
  167.     fch(u, adj[v]) {
  168.         time++;
  169.         dp[v] += dp[u] + s[u] * time;
  170.         time += 1 + t[u];
  171.     }
  172. }
  173.  
  174. void dfs2(int v) {
  175.     s[v] = a[v];
  176.     t[v] = 0;
  177.     fch(u, adj[v]) {
  178.         dfs2(u);
  179.         s[v] += s[u];
  180.         t[v] += 2 + t[u];
  181.         ckmax(leaf[v], leaf[u] + 1);
  182.     }
  183.     ll L = leaf[v] - 1;
  184.     if (sz(adj[v]) == 0) {
  185.         pd[v] = dp[v];
  186.         return;
  187.     }
  188.     sort(all(adj[v]), [&](const int& a, const int& b) {
  189.         return s[b] * (t[a] + 2) < (t[b] + 2) * s[a];
  190.     });
  191.     ll time = 0;
  192.     int M = sz(adj[v]);
  193.     vll psum;
  194.     fch(u, adj[v]) {
  195.         time++;
  196.         dp[v] += dp[u] + s[u] * time;
  197.         time += 1 + t[u];
  198.         ll prev = (!psum.empty() ? psum.back() : 0);
  199.         psum.PB(prev + 2 + t[u]);
  200.     }
  201.     ll ssum = 0;
  202.     for (int i = M-1; i >= 0; --i) {
  203.         int u = adj[v][i];
  204.         if (leaf[u] == L) {
  205.             ll end_minus = (2 + t[u]) * (ssum);
  206.             ll u_time = (i > 0 ? psum[i-1] : 0) * s[u];
  207.             ll new_u_time = (psum[M-1] - (2 + t[u])) * s[u];
  208.             ckmin(pd[v], dp[v] - end_minus - u_time + new_u_time - dp[u] + pd[u]);
  209.         }
  210.         ssum += s[u];
  211.     }
  212. }
  213.  
  214. void solve0() {
  215.     dfs(1);
  216.     cout << t[1] << ' ' << dp[1] << '\n';
  217. }
  218.  
  219. void solve1() {
  220.     leaf.rsz(N+1, 0), pd.rsz(N+1, LL_INF);
  221.     dfs2(1);
  222.     cout << t[1] - leaf[1] << ' ' << pd[1] << '\n';
  223. }
  224.  
  225. int main() { // TIME YOURSELF !!!
  226.     setIO("");
  227.     cin >> N >> T;
  228.     adj.rsz(N+1), a.rsz(N+1), dp.rsz(N+1, 0), s.rsz(N+1), t.rsz(N+1), contains.rsz(N+1, 0);
  229.     for (int i = 2; i <= N; i++) {
  230.         int pi, ai;
  231.         cin >> pi >> ai;
  232.         adj[pi].PB(i);
  233.         a[i] = ai;
  234.     }
  235.     if (T == 0) solve0();
  236.     else solve1();
  237.     return 0;
  238. }
  239.  
  240. // CHECK LONG LONGS, binary search on ans?
  241. // Do something, start simpler
  242. // IBM motto: THINK
  243.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement