Advertisement
welleyth

B. 642 N^2

Oct 26th, 2022
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace std;
  5. using namespace __gnu_pbds;
  6.  
  7. #define int long long
  8. #define pb push_back
  9. #define mp make_pair
  10.  
  11. #pragma GCC optimize("Ofast")
  12. #pragma GCC optimize("unroll-loops")
  13. #pragma GCC target("avx2")
  14.  
  15. constexpr int N = (int)1e5 + 111;
  16. //constexpr int md = (int)998244353;
  17. constexpr long long INF = (long long)1e18 + 11231;
  18. constexpr int K = (int)80;
  19.  
  20. //mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  21. //
  22. //int bpow(int a,int b,int m){
  23. //    if(b == 0)
  24. //        return 1;
  25. //    if(b % 2 == 0){
  26. //        int t = bpow(a,b>>1,m);
  27. //        return (t*t)%m;
  28. //    }
  29. //    return a * bpow(a,b-1,m) % m;
  30. //}
  31.  
  32. vector<int> g[N];
  33. int sz[N];
  34. int c[N];
  35. int l[N],r[N];
  36. int heavy[N];
  37.  
  38. void dfs1(int v){
  39.     sz[v] = 1;
  40.     heavy[v] = -1;
  41.     for(auto& to : g[v]){
  42.         dfs1(to);
  43.         if(heavy[v] == -1 || sz[to] > sz[heavy[v]])
  44.             heavy[v] = to;
  45.         sz[v] += sz[to];
  46.     }
  47.     return;
  48. }
  49.  
  50. int ans = 0;
  51. int cnt[N];
  52. int S[N];
  53. bool can = true;
  54.  
  55. void dfs(int v,set<pair<int,pair<int,int>>>& st){
  56.     if(!can)
  57.         return;
  58.     if(heavy[v] == -1){
  59.         cnt[v] += l[v];
  60.         ans += l[v] * c[v];
  61.         S[v] = l[v];
  62.         if(r[v] - l[v] > 0)
  63.             st.insert(mp(c[v],mp(r[v]-l[v],v)));
  64. //        cerr << "leaf " << v << " " << cnt[v] << "\n";
  65.         return;
  66.     }
  67.     dfs(heavy[v],st);
  68.     S[v] += S[heavy[v]];
  69.     for(auto& to : g[v]){
  70.         if(to == heavy[v])
  71.             continue;
  72.         set<pair<int,pair<int,int>>> nw;
  73.         dfs(to,nw);
  74.         S[v] += S[to];
  75.         if(nw.size() > st.size())
  76.             swap(nw,st);
  77.         for(auto& x : nw)
  78.             st.insert(x);
  79.     }
  80.     if(S[v] > r[v]){
  81.         can = false;
  82.         return;
  83.     }
  84.     int need = l[v] - S[v];
  85.     st.insert(mp(c[v],mp(r[v],v)));
  86.     while(need > 0 && !st.empty()){
  87.         int val = st.begin()->first, cur_cnt = st.begin()->second.first, id = st.begin()->second.second;
  88.         st.erase(st.begin());
  89.         int t = min(need,cur_cnt);
  90.         cur_cnt -= t;
  91.         cnt[id] += t;
  92.         need -= t;
  93.         ans += t * val;
  94.         if(cur_cnt > 0)
  95.             st.insert(mp(val,mp(cur_cnt,id)));
  96.     }
  97.     S[v] = max(S[v],l[v]);
  98.     int bon = r[v] - S[v];
  99.     int cnt = 0;
  100.     set<pair<int,pair<int,int>>> nw;
  101.     int cur_S = 0;
  102.     for(auto& cv : st){
  103.         int x = cv.first, y = cv.second.first, id = cv.second.second;
  104.         int t = min(bon,y);
  105.         bon -= t;
  106.         y = t;
  107.         cur_S += y;
  108.         if(y > 0)
  109.             nw.insert(mp(x,mp(y,id)));
  110.         if(bon == 0)
  111.             break;
  112.         cnt++;
  113.     }
  114.     swap(st,nw);
  115.     assert(bon == 0);
  116.  
  117.     return;
  118. }
  119.  
  120. void solve(){
  121.     int n;
  122.     cin >> n;
  123.  
  124.     ans = 0;
  125.     can = true;
  126.     for(int i = 1; i <= n; i++){
  127.         g[i].clear();
  128.         cnt[i] = 0;
  129.         sz[i] = 0;
  130.         heavy[i] = 0;
  131.         l[i] = r[i] = c[i] = 0;
  132.         S[i] = 0;
  133.     }
  134.  
  135.     for(int i = 2; i <= n; i++){
  136.         int p;
  137.         cin >> p;
  138.         g[p].pb(i);
  139.     }
  140.  
  141.     for(int i = 1; i <= n; i++){
  142.         cin >> c[i];
  143.     }
  144.     for(int i = 1; i <= n; i++){
  145.         cin >> l[i] >> r[i];
  146.     }
  147.  
  148.     dfs1(1);
  149.  
  150.     set<pair<int,pair<int,int>>> st;
  151.     dfs(1,st);
  152.     if(can == false){
  153.         cout << "-1\n";
  154.         return;
  155.     }
  156.  
  157.     cout << ans << "\n";
  158.     for(int i = 1; i <= n; i++)
  159.         cout << cnt[i] << " ";
  160.     cout << "\n";
  161.  
  162.     return;
  163. }
  164.  
  165. signed main(){
  166.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  167. //    freopen("output.txt","w",stdout);
  168. //    init();
  169.     int tests = 1;
  170.     cin >> tests;
  171.     for(int test = 1; test <= tests; test++){
  172. //        cout << "Case #" << test << ": ";
  173.         solve();
  174.     }
  175.     return 0;
  176. }
  177. /**
  178.  
  179. void dfs(int v,set<pair<int,int>>& st){
  180.     dfs(heavy[v],st);
  181.  
  182.     for(auto& to : g[v]){
  183.         if(to == heavy[v]) continue;
  184.         set<pair<int,int>> nw;
  185.         dfs(to,nw);
  186.         if(nw.size() > st.size())
  187.             swap(nw,st);
  188.         for(auto& x : nw)
  189.             st.insert(x);
  190.     }
  191. }
  192.  
  193. **/
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement