Submission #1273970

#TimeUsernameProblemLanguageResultExecution timeMemory
1273970nicolo_010Beech Tree (IOI23_beechtree)C++20
0 / 100
38 ms16036 KiB
#include <bits/stdc++.h>
#include "beechtree.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

vector<vector<int>> adj;
vector<int> sz;

bool cmp(int a, int b) {
	return sz[a] < sz[b];
}

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
	adj.resize(N);
	sz.resize(N);
	for (int i=1; i<N; i++) {
		adj[P[i]].push_back(i);
	}
	for (int i=0; i<N; i++) {
		sz[i] = adj[i].size();
	}
	for (int i=0; i<N; i++) {
		sort(adj[i].begin(), adj[i].end(), cmp);
	}
	vector<bool> valid(N, false);
	for (int i=0; i<N; i++) {
		map<int, int> mp;
		for (auto x : adj[i]) {
			mp[C[x]]++;
		}
		if (mp.size() == adj[i].size()) valid[i] = true;
		else valid[i] = false;
	}
	vector<int> ans(N, 0);
	for (int i=0; i<N; i++) {
		vector<int> p;
		p.push_back(i);
		queue<int> q;
		q.push(i);
		vector<int> mp(3, 0);
		bool can = true;
		while (!q.empty()) {
			int u = q.front();
			q.pop();
			if (!valid[u]) can = false;
			for (auto x : adj[u]) {
				if (p[mp[C[x]]] != P[x]) can = false;
				q.push(x);
				p.push_back(x);
				mp[C[x]]++;
			}
		}
		if (can) ans[i] = 1;
	}
	return ans;
}
#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...