Submission #1198674

#TimeUsernameProblemLanguageResultExecution timeMemory
1198674sheercoldSeptember (APIO24_september)C++20
100 / 100
131 ms15744 KiB
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int solve(int n, int m, std::vector<int> p,
          std::vector<std::vector<int>> s) {
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  vector<vector<int>> tree(n);
  for (int i = 1; i < n; i++) {
    tree[p[i]].push_back(i);
  }
  vector<int> mx(n);
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n - 1; j++) {
      mx[s[i][j]] = max(mx[s[i][j]], j);
    }
  }
  auto dfs = [&](auto&& self, int v) -> void {
    for (int nxt : tree[v]) {
      if (nxt == p[v]) {
        continue;
      }
      self(self, nxt);
      mx[v] = max(mx[v], mx[nxt]);
    }
  };
  dfs(dfs, 0);
  vector<int> R(n - 1);
  iota(R.begin(), R.end(), 0);
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n - 1; j++) {
      R[j] = max(R[j], mx[s[i][j]]);
    }
  }
  int ans = 0;
  for (int i = 0, r = 0; i < n - 1; i++) {
    r = max(r, R[i]);
    if (r <= i) {
      ++ans;
    }
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...