제출 #1336419

#제출 시각아이디문제언어결과실행 시간메모리
1336419apxo9월 (APIO24_september)C++20
55 / 100
1095 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;
    if (*max_element(ptr.begin(), ptr.end()) == n) {
      ++res;
      break;
    }
    bool ct = 1;
    for (int i = 0; i < m; ++i) {
      if (ptr[i] == n) continue;
      while (ptr[i] < n and 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]);
        }
      }
    }
  }
	return res;
}

#ifdef duc_debug
void taskcase() {
	int N, M;
	assert(2 == scanf("%d%d", &N, &M));
	
	std::vector<int> F(N);
	F[0] = -1;
	for (int i = 1; i < N; ++i)
  		assert(1 == scanf("%d", &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)
  			assert(1 == scanf("%d", &S[i][j]));
  	
	printf("%d\n", solve(N, M, F, S));
}

int main() {
	int T;
	assert(1 == scanf("%d", &T));
	while(T--) taskcase();
	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...