1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <cstdio>
  #include <vector>
  using namespace std;

  int main() {
      int k, n1;
      scanf("%d %d", &k, &n1);

      vector<int> ds(k + 2); // ds[i] = start index of day i in flat arrays
      ds[1] = 0;
      ds[2] = n1;

      vector<int> par(n1, 0); // parent array (0 = free meeting)

      for (int i = 2; i <= k; i++) {
          int ni;
          scanf("%d", &ni);
          par.resize(ds[i] + ni);
          for (int j = 0; j < ni; j++)
              scanf("%d", &par[ds[i] + j]);
          ds[i + 1] = ds[i] + ni;
      }

      int N = (int)par.size();
      vector<int> need(N, 0);
      vector<bool> has_child(N, false);

      // Compute need bottom-up: from last day to day 2
      for (int i = k; i >= 2; i--) {
          for (int j = ds[i]; j < ds[i + 1]; j++) {
              if (need[j] == 0) need[j] = 1; // leaf
              if (par[j] > 0) {
                  int p = ds[i - 1] + par[j] - 1;
                  need[p] += need[j];
                  has_child[p] = true;
              }
          }
      }
      // Set leaves on day 1
      for (int j = 0; j < ds[2]; j++)
          if (need[j] == 0) need[j] = 1;

      // Process days left to right
      long long total = 0, pool = 0;

      for (int i = 1; i <= k; i++) {
          // Free workers from day i-1's childless (leaf) meetings
          if (i >= 2) {
              for (int j = ds[i - 1]; j < ds[i]; j++)
                  if (!has_child[j]) pool++;
          }
          // Demand from free (root) meetings on day i
          long long demand = 0;
          for (int j = ds[i]; j < ds[i + 1]; j++)
              if (i == 1 || par[j] == 0)
                  demand += need[j];

          if (demand > pool) {
              total += demand - pool;
              pool = 0;
          } else {
              pool -= demand;
          }
      }

      printf("%lld\n", total);
  }