Submission #1177862

#TimeUsernameProblemLanguageResultExecution timeMemory
1177862trashaccountSeptember (APIO24_september)C++20
30 / 100
1094 ms11848 KiB
#include "september.h"
#include <bits/stdc++.h>
using namespace std;

const int NM = 1e5;

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

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

bool is_ancestor(int u, int v){
	return tin[u] <= tin[v] && tout[u] >= tout[v];
}

void make_set(int v){
	parent[v] = v;
	sz[v] = 1;
}

int find_set(int v){
	return parent[v] == v ? v : parent[v] = find_set(parent[v]);
}

void union_sets(int u, int v){
	u = find_set(u);
	v = find_set(v);
	if (u == v) return;
	if (sz[u] < sz[v]) swap(u, v);
	parent[v] = u;
	sz[u] += sz[v];
	comp--;
}

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 = 1; i < N; i++) make_set(i);
	comp = N-1;
	for (int i = 0; i < M; i++){
		for (int j = 0; j < N; j++) sum[j] = 0;
		for (int j = 0; j < N-1; j++)
			for (int k = j+1; k < N-1; k++)
				if (is_ancestor(S[i][j], S[i][k])) sum[j]++, sum[k]--;

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