Advertisement
ivnikkk

Untitled

Jun 19th, 2022
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define debug(tl) cerr<<#tl<<' '<<tl<<'\n';
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. #define all(d) d.begin(), d.end()
  6. #define int long long
  7. typedef long long ll;
  8. typedef pair<ll, ll> pll;
  9. typedef long double ld;
  10. vector<vector<ll>> gr;
  11. vector<int> head, siz, tin, tout, parent, a;
  12. const int inf = 1e13;
  13. vector<ll> sums, us, ans;
  14. struct segtree {
  15.     vector<int> t, mod;
  16.     int n;
  17.     segtree() {}
  18.     void init(int _n) {
  19.         n = _n;
  20.         mod.resize(4 * n + 100, 0);
  21.         t.resize(4 * n + 100, inf);
  22.     }
  23.  
  24.     void push(ll v) {
  25.         t[v] += mod[v];
  26.         if (v * 2 + 1 > (ll)t.size()) {
  27.             mod[v] = 0;
  28.             return;
  29.         }
  30.         mod[v * 2] += mod[v];
  31.         mod[v * 2 + 1] += mod[v];
  32.         mod[v] = 0;
  33.     }
  34.     void build(int v, int tl, int tr, vector<int>& a) {
  35.         if (tl == tr) {
  36.             t[v] = a[tl];
  37.             return;
  38.         }
  39.         int tm = (tl + tr) / 2;
  40.         build(v * 2, tl, tm, a);
  41.         build(v * 2 + 1, tm + 1, tr, a);
  42.         t[v] = min(t[v * 2], t[v * 2 + 1]);
  43.     }
  44.     void update(int v, int tl, int tr, int l, int r, int add) {
  45.         push(v);
  46.         if (tl > r || tr < l) {
  47.             return;
  48.         }
  49.         if (tl >= l && tr <= r) {
  50.             mod[v] += add;
  51.             push(v);
  52.             return;
  53.         }
  54.         int mid = (tl + tr) / 2;
  55.         push(v * 2);
  56.         push(v * 2 + 1);
  57.         update(v * 2, tl, mid, l, r, add);
  58.         update(v * 2 + 1, mid + 1, tr, l, r, add);
  59.         t[v] = min(t[v * 2], t[v * 2 + 1]);
  60.     }
  61.     int get(int v, int tl, int tr, int pos) {
  62.         push(v);
  63.         if (tl == tr) {
  64.             return t[v];
  65.         }
  66.         int tm = (tl + tr) / 2;
  67.         if (pos <= tm) {
  68.             return get(v * 2, tl, tm, pos);
  69.         }
  70.         else {
  71.             return get(v * 2 + 1, tm + 1, tr, pos);
  72.         }
  73.     }
  74.     int get_mn(int v, int tl, int tr, int l, int r) {
  75.         push(v);
  76.         if (tl > r || tr < l) {
  77.             return inf;
  78.         }
  79.         if (tl >= l && tr <= r) {
  80.             return t[v];
  81.         }
  82.         int tm = (tl + tr) / 2;
  83.         push(v);
  84.         push(v * 2);
  85.         push(v * 2 + 1);
  86.         return min(get_mn(v * 2, tl, tm, l, r), get_mn(v * 2 + 1, tm + 1, tr, l, r));
  87.     }
  88. };
  89. int t = 0;
  90. void dfs1(int v, int p) {
  91.     siz[v] = 1;
  92.     for (int& u : gr[v]) {
  93.         if (u == p) {
  94.             swap(u, gr[v].back());
  95.             gr[v].pop_back();
  96.             break;
  97.         }
  98.     }
  99.     parent[v] = (p == -1 ? v : p);
  100.     for (int& u : gr[v]) {
  101.         dfs1(u, v);
  102.         siz[v] += siz[u];
  103.         if (siz[u] > siz[gr[v][0]]) {
  104.             swap(gr[v][0], u);
  105.         }
  106.     }
  107. }
  108. void dfs2(int v) {
  109.     tin[v] = t++;
  110.     a.push_back(us[v]);
  111.     for (int& u : gr[v]) {
  112.         if (u == gr[v][0]) {
  113.             head[u] = head[v];
  114.         }
  115.         else {
  116.             head[u] = u;
  117.         }
  118.         dfs2(u);
  119.     }
  120.     tout[v] = t;
  121. }
  122.  
  123. bool is_in_sector(int u, int v) {
  124.     return tin[u] <= tin[v] && tin[v] < tout[u];
  125. }
  126. void up(int& u, int& v, int& ans, segtree& Euler) {
  127.     while (!is_in_sector(head[u], v)) {
  128.         ans = min(ans, Euler.get_mn(1, 0, Euler.n - 1, tin[head[u]], tin[u]));
  129.         u = parent[head[u]];
  130.     }
  131. }
  132. int get_min(int u, int v, segtree &Euler) {
  133.     int ans = inf;
  134.     up(u, v, ans, Euler);
  135.     up(v, u, ans, Euler);
  136.     if (!is_in_sector(u, v)) {
  137.         swap(u, v);
  138.     }
  139.     ans = min(ans, Euler.get_mn(1, 0, Euler.n - 1, tin[u], tin[v]));
  140.     return ans;
  141. }
  142. void upd(int& u, int& v, int x, segtree& Euler) {
  143.     while (!is_in_sector(head[u], v)) {
  144.         Euler.update(1, 0, Euler.n - 1, tin[head[u]], tin[u], x);
  145.         u = parent[head[u]];
  146.     }
  147. }
  148. void update(int u, int v, int x, segtree& Euler) {
  149.     upd(u, v, x, Euler);
  150.     upd(v, u, x, Euler);
  151.     if (!is_in_sector(u, v)) {
  152.         swap(u, v);
  153.     }
  154.     Euler.update(1, 0, Euler.n - 1, tin[u], tin[v], x);
  155. }
  156.  
  157. vector<ll> l, r, c;
  158. vector<multiset<pll>> mrg;// first - c, second - num of vertex
  159. // будем в вершину приливать значения сыновей
  160. // значения : сортировка в сету по стоимост (С) , второй элемент : кол во раз которой мы можем использовать эту стоимость
  161. // мы можем не зная ответа знать сколько максимум можно использовать стоимость из сыновей поддерева
  162. bool ok;
  163.  
  164. void dfs(ll v, ll p, segtree &Euler) {
  165.     if (!ok) {
  166.         return;
  167.     }
  168.     for (ll& u : gr[v]) {
  169.         if (u != p) {
  170.             dfs(u, v, Euler);
  171.             sums[v] += sums[u];
  172.             if ((int)mrg[v].size() < (int)mrg[u].size()) {
  173.                 mrg[v].swap(mrg[u]);
  174.             }
  175.             for (auto& it : mrg[u]) {
  176.                 mrg[v].insert(it);
  177.             }
  178.             mrg[u].clear();
  179.         }
  180.     }
  181.     mrg[v].insert({ c[v],v });
  182.     if (sums[v] < l[v]) {
  183.         while (!mrg[v].empty() && sums[v] < l[v]) {
  184.             auto it = mrg[v].begin();
  185.             pll x = *it;
  186.             mrg[v].erase(mrg[v].begin());
  187.             ll have = get_min(x.second, 0, Euler);
  188.             ll need = min(have, l[v] - sums[v]);
  189.             ans[x.second] += need;
  190.             sums[v] += need;
  191.             update(x.second, 0, -need, Euler);
  192.             if (need < have) {
  193.                 mrg[v].insert(x);
  194.             }
  195.         }
  196.         if (sums[v] < l[v]) {
  197.             //ll gg = mrg[v].size();
  198.             ok = false;
  199.             return;
  200.         }
  201.     }
  202. }
  203. // нужно насчитать предков с минимальой суммой
  204.  
  205. void precalc1(ll v, ll p) {
  206.     ll suml = 0;
  207.     if (!ok)return;
  208.     for (ll& u : gr[v]) {
  209.         if (u != p) {
  210.             precalc1(u, v);
  211.             suml += l[u];
  212.         }
  213.     }
  214.     if (suml > r[v]) {
  215.         ok = false;
  216.         return;
  217.     }
  218.     us[v] = r[v];
  219. }
  220.  
  221. void clean() {
  222.     t = 0;
  223.     ok = 1;
  224.     gr.clear(), siz.clear();
  225.     tin.clear(), tout.clear();
  226.     parent.clear(), a.clear();
  227.     sums.clear(), us.clear();
  228.     ans.clear(), head.clear();
  229.     l.clear(), r.clear(), c.clear(), mrg.clear();
  230. }
  231. signed main() {
  232. #ifdef _DEBUG
  233.     freopen("input.txt", "r", stdin);
  234.     freopen("output.txt", "w", stdout);
  235. #endif
  236.     ios_base::sync_with_stdio(false);
  237.     cin.tie(nullptr);
  238.     cout.tie(nullptr);
  239.     ll tt;
  240.     cin >> tt;
  241.     while (tt--) {
  242.         ok = true;
  243.         ll n;
  244.         cin >> n;
  245.         clean();
  246.         us.resize(n), mrg.resize(n), gr.resize(n), l.resize(n), r.resize(n), c.resize(n), sums.resize(n);
  247.         tin.resize(n), tout.resize(n), siz.resize(n), head.resize(n), parent.resize(n);
  248.         for (ll i = 1; i < n; i++) {
  249.             ll p;
  250.             cin >> p; p--;
  251.             gr[p].push_back(i);
  252.             gr[i].push_back(p);
  253.         }
  254.         for (ll i = 0; i < n; i++) {
  255.             cin >> c[i];
  256.         }
  257.         for (ll i = 0; i < n; i++) {
  258.             cin >> l[i] >> r[i];
  259.         }
  260.         precalc1(0, -1);
  261.         if (!ok) {
  262.             cout << "-1\n";
  263.             continue;
  264.         }
  265.         segtree Euler;
  266.         dfs1(0, -1);
  267.         dfs2(0);
  268.         Euler.init((int)a.size());
  269.         Euler.build(1, 0, Euler.n - 1, a);
  270.         ans.clear();
  271.         ans.resize(n);
  272.         dfs(0, -1, Euler);
  273.         if (!ok) {
  274.             cout << "-1\n";
  275.             continue;
  276.         }
  277.         ll anssum = 0;
  278.         for (ll i = 0; i < ans.size(); i++) {
  279.             anssum += ans[i] * c[i];
  280.         }
  281.         cout << anssum << '\n';
  282.         for (ll i = 0; i < ans.size(); i++) {
  283.             cout << ans[i] << ' ';
  284.         }
  285.         cout << '\n';
  286.     }
  287.  
  288. }
  289.  
  290.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement