제출 #1155725

#제출 시각아이디문제언어결과실행 시간메모리
1155725blackslex9월 (APIO24_september)C++20
45 / 100
338 ms16120 KiB
#include "september.h"
#include <vector>
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

struct segment {
	int t[N * 4];
	void upd (int l, int r, int idx, int pos, int val) {
		if (l == r) return void(t[idx] = max(t[idx], val));
		int mid = (l + r) >> 1;
		if (pos <= mid) upd(l, mid, idx * 2 + 1, pos, val);
		else upd(mid + 1, r, idx * 2 + 2, pos, val);
		t[idx] = max(t[idx * 2 + 1], t[idx * 2 + 2]);
	}
	int qr (int l, int r, int idx, int tl, int tr) {
		if (l > tr || r < tl) return 0;
		if (l >= tl && r <= tr) return t[idx];
		int mid = (l + r) >> 1;
		return max(qr(l, mid, idx * 2 + 1, tl, tr), qr(mid + 1, r, idx * 2 + 2, tl, tr));
	}
};

int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
	int n = N, m = M;
	vector<vector<int>> v(n, vector<int>());
	vector<vector<int>> pos(m, vector<int>(n));
	vector<vector<int>> rpos(m, vector<int>(n));
	vector<segment> segm(m);
	int t = -1;
	for (int i = 1; i < n; i++) {
		v[F[i]].emplace_back(i);
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n - 1; j++) {
			pos[i][S[i][j]] = j;
		}
	}
	auto dfs = [&] (auto &&dfs, int cur, int par) -> void {
		for (auto &e: v[cur]) {
			if (par == e) continue;
			dfs(dfs, e, cur);
			for (int i = 0; i < m; i++) {
				pos[i][cur] = max(pos[i][cur], pos[i][e]);
			}
		}
	};
	dfs(dfs, 0, -1);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n - 1; j++) {
			segm[i].upd(0, n - 2, 0, j, pos[i][S[i][j]]);
		}
	}
	for (int i = 0; i < m; i++) {
		for (int j = n - 2; j >= 0; j--) {
			rpos[i][j] = segm[i].qr(0, n - 2, 0, j, pos[i][S[i][j]]);
			segm[i].upd(0, n - 2, 0, j, rpos[i][j]);
		}
	}
	int ans = 0;
	vector<int> ptr(m);
	for (int i = 0; ; i++) {
		int mx = -1;
		for (int j = 0; j < m; j++) {
			mx = max(mx, rpos[j][ptr[j]]);
		}
		for (int j = 0; j < m; j++) {
			ptr[j] = mx + 1;
		}
		ans++;
		if (mx + 1 >= n - 1) break;
	}
	return ans;
	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...