Advertisement
Guest User

Untitled

a guest
Dec 26th, 2019
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. template<typename T>
  2. void relax_min(T& cur, T val) {
  3.     cur = min(cur, val);
  4. }
  5.  
  6. template<typename T>
  7. void relax_max(T& cur, T val) {
  8.     cur = max(cur, val);
  9. }
  10.  
  11. #define int li
  12. //const int mod = 1000000007;
  13.  
  14. vector<vector<int>> g;
  15. vector<int> cnt;
  16. vector<int> dp_all, dp_stay;
  17. vector<int> a;
  18. int k;
  19.  
  20. struct DP {
  21.   int dp_all, dp_stay, cnt;
  22.   int to;
  23.   bool operator < (const DP& ot) const {
  24.     return dp_all + cnt * 2 < ot.dp_all + ot.cnt * 2;
  25.   }
  26. };
  27.  
  28. DP merge(const DP& l, const DP& r) {
  29.   if (l.cnt == 0) {
  30.     return r;
  31.   }
  32.   if (r.cnt == 0) {
  33.     return l;
  34.   }
  35.   DP res = {min(l.dp_all, r.dp_all - 2 * l.cnt), -1, l.cnt + r.cnt, -1};
  36.   return res;
  37. }
  38.  
  39. void dfs(int v, int p) {
  40.   cnt[v] = 1;
  41.   vector<DP> dps;
  42.   for (int to : g[v]) {
  43.     if (to == p) {
  44.       continue;
  45.     }
  46.     dfs(to, v);
  47.     cnt[v] += cnt[to];
  48.     dps.push_back({dp_all[to], dp_stay[to], cnt[to], to});
  49.   }
  50.   sort(all(dps));
  51.   dp_all[v] = min(a[v], a[v] + k - 2 * cnt[v]);
  52.   dp_stay[v] = -(int)1e18;
  53.   if (dps.empty()) {
  54.     dp_stay[v] = a[v];
  55.     return;
  56.   }
  57.   vector<DP> pref_dp(dps.size() + 1, {0, 0, 0, -1});
  58.   auto suf_dp = pref_dp;
  59.   for (int i = 0; i < dps.size(); ++i) {
  60.     pref_dp[i + 1] = merge(pref_dp[i], dps[i]);
  61.   }
  62.   for (int i = (int)dps.size() - 1; i >= 0; --i) {
  63.     suf_dp[i] = merge(dps[i], suf_dp[i + 1]);
  64.   }
  65.   relax_min(dp_all[v], pref_dp.back().dp_all - 1);
  66.   for (int i = 0; i < dps.size(); ++i) {
  67.     DP cur_dp = merge(pref_dp[i], suf_dp[i + 1]);
  68.     int t = dps[i].dp_stay - 2 * cur_dp.cnt;
  69.     if (dps.size() > 1) {
  70.       relax_min(t, cur_dp.dp_all);
  71.     }
  72.     t = min(t - 1, a[v] + k - 2 * (cnt[v] - cnt[dps[i].to]));
  73.     t = min(t, a[v]);
  74.     relax_max(dp_stay[v], t);
  75.   }
  76.   //cout << v << " " << dp_all[v] << " " << dp_stay[v] << endl;
  77. }
  78.  
  79. void solve(__attribute__((unused)) bool read) {
  80.   int n;
  81.   cin >> n >> k;
  82.   cnt.assign(n, 0);
  83.   g.resize(n);
  84.   dp_all.resize(n);
  85.   dp_stay.resize(n);
  86.   for (int i = 1; i < n; ++i) {
  87.     int x, y;
  88.     cin >> x >> y;
  89.     --x; --y;
  90.     g[x].push_back(y);
  91.     g[y].push_back(x);
  92.   }
  93.   a.resize(n);
  94.   for (int i = 0; i < n; ++i) {
  95.     cin >> a[i];
  96.   }
  97.   dfs(0, 0);
  98.   int res = dp_stay[0];
  99.   if (res < 0) {
  100.     res = -1;
  101.   }
  102.   cout << res << endl;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement