Submission #1179049

#TimeUsernameProblemLanguageResultExecution timeMemory
1179049JelalTkm9월 (APIO24_september)C++20
25 / 100
1 ms584 KiB
#include <bits/stdc++.h>
#include "september.h"
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")

using namespace std;

// #define int long long int

// const int N = 2e5 + 10;
// const int md = 1e9 + 7;
// const int INF = 1e18;

int solve(int n, int m, vector<int> f, vector<vector<int>> s) {
  vector<vector<int>> num(m + 1, vector<int> (n));
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < (n - 1); j++) {
      num[i][s[i][j]] = j;
    }
  }

  vector<vector<int>> g(n + 1, vector<int> ());
  for (int i = 1; i < n; i++) {
    g[i].push_back(f[i]);
    g[f[i]].push_back(i);
  }

  vector<vector<int>> dp(m + 1, vector<int> (n + 1));
  function<void(int, int)> dfs = [&](int u, int p) {
    for (int i = 0; i < m; i++)
      dp[i][u] = num[i][u];
    for (auto v: g[u]) {
      if (v != p) {
        dfs(v, u);
        for (int i = 0; i < m; i++)
          dp[i][u] = max(dp[i][u], dp[i][v]);
      }
    }
  };
  dfs(0, -1);

  vector<vector<int>> pref(m + 1, vector<int> (n + 1));
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < (n - 1); j++) {
      pref[i][j] = max((j > 0 ? pref[i][j - 1] : 0), dp[i][s[i][j]]);
    }
  }

  map<int, int> mp;

  int ans = 0;
  vector<int> ind(m, -1);
  int cnt = 0;
  while (true) {
    for (int i = 0; i < m; i++)
      ind[i]++;
    ans++;
    if (ind[0] == (n - 1)) {
      ans--;
      break;
    }
    bool ok = 1;
    while (ok) {
      ok = 0;
      int mx = 0;
      for (int i = 0; i < m; i++) {
        mx = max(mx, pref[i][ind[i]]);
      }
      for (int i = 0; i < m; i++) {
        for (int j = ind[i]; j <= mx; j++)
          mp[s[i][j]] = 1;
        ind[i] = mx;
      }
      if (ind[0] + 1 != (int) mp.size()) {
        for (int i = 0; i < m; i++)
          ind[i]++;
        ok = 1;
      }
    }
  }

  return ans;
}

// int32_t main(int32_t argc, char *argv[]) {
//   ios::sync_with_stdio(false);
//   cin.tie(nullptr);

//   int T = 1;
//   cin >> T;
//   while (T--) {
//     int n, m;
//     cin >> n >> m;
//     vector<int> f(n);
//     f[0] = -1;
//     for (int i = 1; i < n; i++)
//       cin >> f[i];
//     vector<vector<int>> s(m, vector<int> (n - 1));
//     for (int i = 0; i < m; i++) {
//       for (int j = 0; j < (n - 1); j++)
//         cin >> s[i][j];
//     }

//     cout << solve(n, m, f, s) << '\n';
//   }

//   return 0;
// }
#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...