Submission #1244513

#TimeUsernameProblemLanguageResultExecution timeMemory
1244513farukSeptember (APIO24_september)C++20
100 / 100
89 ms9792 KiB
#include "september.h"

#include <bits/stdc++.h>

using namespace std;

int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
	vector<vector<int> > pref_sizes(M, vector<int>(N - 1));
	vector<vector<int> > wher_is(M, vector<int>(N));
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N - 1; j++)
			wher_is[i][S[i][j]] = j;
	}
	
	vector<bool> is_same(N);
	for (int i = 0; i < N - 1; i++) {
		int max_val = i;
		for (int j = 0; j < M; j++) {
			pref_sizes[j][i] = wher_is[j][S[0][i]];
			if (i > 0)
				pref_sizes[j][i] = max(pref_sizes[j][i], pref_sizes[j][i - 1]);
			max_val = max(max_val, pref_sizes[j][i]);
		}
		if (max_val == i)
			is_same[i] = true;
	}

	vector<int> indeg(N, 0);
	vector<bool> tbd(N);
	for (int i = 1; i < N; i++)
		indeg[F[i]]++;
	
	int tbd_cnt = 0; int out = 0;
	for (int i = 0; i < N - 1; i++) {
		int me = S[0][i];
		tbd[me] = true;
		tbd_cnt++;
		while (indeg[me] == 0 and tbd[me]) {
			tbd[me] = false;
			tbd_cnt--;

			me = F[me];
			indeg[me]--;
		}

		if (tbd_cnt == 0 and is_same[i])
			out++;
	}
	

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