Submission #1336443

#TimeUsernameProblemLanguageResultExecution timeMemory
1336443apxoSeptember (APIO24_september)C++20
100 / 100
181 ms23500 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];
  int lt[maxn][6];
  int ptr[6], nxt[6];
  
  void dfs(int u) {
    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];
  }
  for (int i = 0; i < n; ++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) {
      lt[p[i][j]][j] = i;
    }
    g[par[i]].push_back(i);
  }
  dfs(0);
  debug(1000 * clock() / CLOCKS_PER_SEC);
  int res = 0;
  for (int i = 0; i < m; ++i) {
    ptr[i] = 1;
    nxt[i] = 1;
  }
  while (*min_element(ptr, ptr + m) < n) {
    stack<int> st;
    for (int i = 0; i < m; ++i) {
      if (ptr[i] < n and ptr[i] <= nxt[i]) st.push(i);
    }
    while (!st.empty()) {
      auto i = st.top(); st.pop();
      while (ptr[i] < n and ptr[i] <= nxt[i]) {
        int val = p[ptr[i]][i];
        for (int j = 0; j < m; ++j) {
          if (lt[val][j] > nxt[j]) {
            nxt[j] = lt[val][j];
            st.push(j);
          }
        }
        ++ptr[i];
      }
    }
    bool ct = 1;
//    for (int i = 0; i < m; ++i) {
//      if (ptr[i] <= nxt[i] || 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], ptr[i]);
        }
      }
    }
  }
	return res;
}

#ifdef duc_debug
void taskcase() {
	int N, M;
	cin >> N >> M;
	
	std::vector<int> F(N);
	F[0] = -1;
	for (int i = 1; i < N; ++i)
  	cin >> F[i];
	
	std::vector<std::vector<int>> S(M, std::vector<int>(N - 1));
	for (int i = 0; i < M; ++i)
		for (int j = 0; j < N - 1; ++j)
  			cin >> S[i][j];
  	
	printf("%d\n", solve(N, M, F, S));
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  
	int T;
	cin >> T;
	while(T--) taskcase();
	
	debug(1000 * clock() / CLOCKS_PER_SEC);
	return 0;
}
#endif
#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...