Submission #1177886

#TimeUsernameProblemLanguageResultExecution timeMemory
1177886trashaccountSeptember (APIO24_september)C++20
100 / 100
366 ms17928 KiB
#include "september.h"
#include <bits/stdc++.h>
using namespace std;

const int NM = 1e5;

struct segtree{
	int data[4*NM+5];
	void build(int id, int l, int r){
		data[id] = -1;
		if (l == r) return;
		int mid = (l+r)/2;
		build(2*id, l, mid);
		build(2*id+1, mid+1, r);
	}
	void update(int id, int l, int r, int i, int val){
		if (i < l || i > r) return;
		if (l == r){
			data[id] = max(data[id], val);
			return;
		}
		int mid = (l+r)/2;
		update(2*id, l, mid, i, val);
		update(2*id+1, mid+1, r, i, val);
		data[id] = max(data[2*id], data[2*id+1]);
	}
	int get(int id, int l, int r, int u, int v){
		if (u > v || v < l || u > r) return -1;
		if (l >= u && r <= v) return data[id];
		int mid = (l+r)/2;
		return max(get(2*id, l, mid, u, v), get(2*id+1, mid+1, r, u, v));
	}
} ST1, ST2;

int N, M;
vector <int> son[NM+5];
int timer, tin[NM+5], tout[NM+5];
int sum[NM+5], res[NM+5];

void dfs(int u){
	tin[u] = ++timer;
	for (int v : son[u]) dfs(v);
	tout[u] = timer;
}

int solve(int _N, int _M, vector <int> F, vector <vector <int> > S){
	N = _N, M = _M;
	for (int i = 0; i < N; i++) son[i].clear();
	for (int i = 1; i < N; i++){
		int p = F[i];
		son[p].push_back(i);
	}
	timer = 0;
	dfs(0);

	for (int i = 0; i < M; i++){
		for (int j = 1; j <= 4*N; j++){
			ST1.data[j] = -1;
			ST2.data[j] = -1;
		}
		for (int j = 0; j < N; j++) sum[j] = 0;
		for (int j = N-2; j >= 0; j--){
			int u = S[i][j];
			int k = ST1.get(1, 1, N, tin[u], tout[u]);
			if (k > j) sum[j]++, sum[k]--;
			if (i > 0){
				k = ST2.get(1, 1, N, 1, res[u]);
				if (k > j) sum[j]++, sum[k]--;
			}
			
			ST1.update(1, 1, N, tin[u], j);
			ST2.update(1, 1, N, res[u], j);
		}

		res[S[i][0]] = 1;
		for (int j = 0; j < N-2; j++){
			if (j > 0) sum[j] += sum[j-1];
			if (sum[j] > 0) res[S[i][j+1]] = res[S[i][j]];
			else res[S[i][j+1]] = res[S[i][j]]+1;
		}
	}
	int mx = 0;
	for (int i = 1; i < N; i++) mx = max(mx, res[i]);
	return mx;
}
#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...