Submission #1345735

#TimeUsernameProblemLanguageResultExecution timeMemory
1345735trideserBeech Tree (IOI23_beechtree)C++20
23 / 100
2096 ms2162688 KiB
#include "beechtree.h"
#include <bits/stdc++.h>
using namespace std;

struct treeseq {
	list<vector<pair<int, long long>>> seq;
	int size = 0;
};

vector<vector<pair<int, int>>> children;
vector<int> subtreesize;
vector<int> ret;
vector<vector<int>> subtree;

int getsubtreesize(int node, int parent) {
	int res = 1;
	subtree[node].push_back(node);
	for(auto it = children[node].begin(); it != children[node].end(); it++) {
		if(it->second == parent) {
			children[node].erase(it);
			break;
		}
	}
	for(pair<int, int> e : children[node]) {
		res += getsubtreesize(e.second, node);
		for(int a : subtree[e.second]) subtree[node].push_back(a);
	}
	subtreesize[node] = res;
	return res;
}

bool issubtree(int a, int b) { // is b subtree of a
	vector<pair<int, int>>& ca = children[a];
	vector<pair<int, int>>& cb = children[b];
	for(int i = 1; i < ca.size(); i++) {
		if(ca[i - 1].first == ca[i].first) return false;
	}
	for(int i = 1; i < cb.size(); i++) {
		if(cb[i - 1].first == cb[i].first) return false;
	}
	for(int i = 0; i < ca.size(); i++) {
		bool bb = false;
		for(int j = 0; j < cb.size(); j++) {
			if(ca[i].first == cb[j].first) {
				bb = issubtree(ca[i].second, cb[j].second);
			}
		}
		if(!bb) return false;
	}
	return true;
}

treeseq* merge(treeseq* left, treeseq* right) {
	if(left == nullptr && right == nullptr) return nullptr;
	if(left == nullptr) {
		delete right;
		return nullptr;
	}
	if(right == nullptr) {
		delete left;
		return nullptr;
	}
	if(left->size < right->size) {
		treeseq* temp = left;
		left = right;
		right = temp;
	}
	return nullptr;
}

void dp(int node) {
	for(pair<int, int> e : children[node]) dp(e.second);
	bool res = true;
	for(int a : subtree[node]) {
		for(int b : subtree[node]) {
			if(subtreesize[a] <= subtreesize[b]) res = res && issubtree(a, b);
			else res = res && issubtree(b, a);
		}
	}
	ret[node] = res;
}

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
	children.resize(N);
	subtreesize.resize(N);
	subtree.resize(N);
	ret.resize(N);
	for(int i = 1; i < N; i++) {
		children[P[i]].push_back(make_pair(C[i], i));
	}
	for(int i = 0; i < N; i++) {
		sort(children[i].begin(), children[i].end());
	}
	getsubtreesize(0, -1);
	dp(0);
	return ret;
}
#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...