Advertisement
erek1e

USACO Cowflix (slow)

Mar 23rd, 2023
824
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 1e9;
  8.  
  9. string s;
  10. vector<vector<int>> g;
  11.  
  12. vector<int> minCostInclusive, minCost; // inclusive/exclusive <- whether node is / is not in a component
  13. vector<int> minCostInclusiveM, minCostM; // optimal number of components
  14. void dfs(int node, int k, int par = -1) {
  15.     minCostInclusive[node] = k+1, minCostInclusiveM[node] = 1;
  16.     minCost[node] = 0, minCostM[node] = 0;
  17.     for (int child : g[node]) {
  18.         if (child == par) continue;
  19.         dfs(child, k, node);
  20.         if (minCost[child] < minCostInclusive[child] - k) {
  21.             minCostInclusive[node] += minCost[child],
  22.             minCostInclusiveM[node] += minCostM[child];
  23.         } else {
  24.             minCostInclusive[node] += minCostInclusive[child] - k;
  25.             minCostInclusiveM[node] += minCostInclusiveM[child] - 1;
  26.         }
  27.         minCost[node] += minCost[child], minCostM[node] += minCostM[child];
  28.     }
  29.     if (s[node] == '0') { // take min of inclusive and exclusive
  30.         pair<int, int> mn = min(pair<int, int>{minCost[node], minCostM[node]}, {minCostInclusive[node], minCostInclusiveM[node]});
  31.         minCost[node] = mn.first, minCostM[node] = mn.second;
  32.     }
  33.     else minCost[node] = minCostInclusive[node], minCostM[node] = minCostInclusiveM[node];
  34. }
  35.  
  36. vector<int> c, m; // for a certain k: cost, optimal number of components
  37. void fillIn(int k) {
  38.     dfs(0, k);
  39.     c[k] = minCost[0], m[k] = minCostM[0];
  40. }
  41.  
  42. void divideAndConquer(int l, int r) {
  43.     if (m[l-1] == m[r+1]) {
  44.         for (int i = l; i <= r; ++i) {
  45.             m[i] = m[i-1];
  46.             c[i] = c[i-1] + m[i-1];
  47.         }
  48.     } else if (l <= r) {
  49.         int i = (l + r) / 2;
  50.         fillIn(i);
  51.         divideAndConquer(l, i-1);
  52.         divideAndConquer(i+1, r);
  53.     }
  54. }
  55.  
  56. int main() {
  57.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  58.     int n;
  59.     cin >> n >> s;
  60.     g.resize(n);
  61.     for (int i = 0; i < n-1; ++i) {
  62.         int u, v; cin >> u >> v;
  63.         --u, --v;
  64.         g[u].push_back(v);
  65.         g[v].push_back(u);
  66.     }
  67.     minCostInclusive = minCost = minCostInclusiveM = minCostM = vector<int>(n);
  68.     c = m = vector<int>(1+n+1);
  69.     m[0] = n+1, m[n+1] = 0;
  70.     divideAndConquer(1, n);
  71.     for (int k = 1; k <= n; ++k) cout << c[k] << '\n';
  72.     return 0;
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement