Submission #1336418

#TimeUsernameProblemLanguageResultExecution timeMemory
1336418apxoSeptember (APIO24_september)C++20
55 / 100
1093 ms1368 KiB
#include "september.h"
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else 
#define debug(...)
#endif

namespace {
  int n, m;
  const int maxn = 1e5 + 5;
  int par[maxn];
  vector<int> g[maxn];
  int p[maxn][6], pos[maxn][6];
  int lt[maxn][6];
  
  void dfs(int u) {
    for (int c = 0; c < m; ++c) {
      lt[u][c] = pos[u][c];
    }
    for (auto v : g[u]) {
      dfs(v);
      for (int c = 0; c < m; ++c) {
        lt[u][c] = max(lt[u][c], lt[v][c]);
      }
    }
  }
}

int solve(int N, int M, vector<int> F, vector<vector<int>> S) {
  n = N, m = M;
  for (int i = 1; i < n; ++i) {
    par[i] = F[i];
    g[i].clear();
  }
  for (int i = 0; i < m; ++i) {
    for (int j = 1; j < n; ++j) p[j][i] = S[i][j - 1];
  }
  for (int i = 1; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      pos[p[i][j]][j] = i;
    }
    g[par[i]].push_back(i);
  }
  dfs(0);
  int res = 0;
  vector<int> ptr(m, 1), nxt(m);
  for (int i = 0; i < m; ++i) {
    nxt[i] = lt[p[1][i]][i];
  }
  debug(nxt);
  while (true) {
    if (*min_element(ptr.begin(), ptr.end()) == n) break;
    bool ct = 1;
    for (int i = 0; i < m; ++i) {
      while (ptr[i] <= nxt[i]) {
        int val = p[ptr[i]][i];
        nxt[i] = max(nxt[i], lt[val][i]);
        for (int j = 0; j < m; ++j) {
          if (i == j) continue;
          nxt[j] = max(nxt[j], pos[val][j]);
        }
        ++ptr[i];
      }
    }
    for (int i = 0; i < m; ++i) {
      if (ptr[i] != ptr[0]) {
        ct = 0;
        break;
      }
    }
    if (ct) {
      ++res;
      for (int i = 0; i < m; ++i) {
        if (ptr[i] < n) {
          nxt[i] = max(nxt[i], lt[p[ptr[i]][i]][i]);
        }
      }
    }
//    debug(res, ptr, nxt);
  }
	return res;
}
#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...