Submission #1178389

#TimeUsernameProblemLanguageResultExecution timeMemory
1178389Kaztaev_AlisherBeech Tree (IOI23_beechtree)C++20
9 / 100
2123 ms763540 KiB
#include <bits/stdc++.h>

#define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define all(a) a.begin() , a.end()
#define F first
#define S second

using namespace std;
using ll = long long;

const ll N = 2e5+5 , inf = 2e9 + 7;
const ll INF = 1e18 ,   mod = 1e9+7;

int n , m , p[N] , cnt[N] , c[N];
vector<int> sub[N];
vector<int> solve(){
	for(int i = 1; i <= n; i++){
		int x = p[i];
		while(x > 0){
			sub[x].push_back(i);
			x = p[x];	
		}
	}
	vector<int> ans(n,0);
	for(int v = 1; v <= n; v++){
		sort(all(sub[v]));
		while(next_permutation(all(sub[v]))){
			int ok = 1;
			// cout << v << "\n";
			for(int j = 0; j < sub[v].size(); j++){
				int u = sub[v][j];
				if(cnt[c[u]] == 0){
					if(p[u] != v) ok = 0;
				} else {
					if(p[u] != sub[v][cnt[c[u]]-1]) ok = 0;
				}
				cnt[c[u]]++;
			}
			for(int j = 0; j < sub[v].size(); j++){
				int u = sub[v][j];
				cnt[c[u]]--;
			}
			if(ok == 1){
				ans[v-1] = 1;
			}
		}
		if(1){
			sort(all(sub[v]));
			int ok = 1;
			for(int j = 0; j < sub[v].size(); j++){
				int u = sub[v][j];
				if(cnt[c[u]] == 0){
					if(p[u] != v) ok = 0;
				} else {
					if(p[u] != sub[v][cnt[c[u]]-1]) ok = 0;
				}
				cnt[c[u]]++;
			}
			for(int j = 0; j < sub[v].size(); j++){
				int u = sub[v][j];
				cnt[c[u]]--;
			}
			if(ok == 1){
				ans[v-1] = 1;
			}
		}
		if(sub[v].size() == 0) ans[v-1] = 1;
	}
	return ans;
}
vector<int> beechtree(int N, int M, vector<int> P, vector<int> C){
	n = N; m = M;
	for(int i = 0; i < P.size(); i++){
		p[i+1] = P[i]+1;
		c[i+1] = C[i];
	}
	return solve();
}
// int main()
// {
    // int N, M;
    // assert(2 == scanf("%d %d", &N, &M));
    // std::vector<int> P(N);
    // for (int i = 0; i < N; ++i)
        // assert(1 == scanf("%d", &P[i]));
    // std::vector<int> C(N);
    // for (int i = 0; i < N; ++i)
        // assert(1 == scanf("%d", &C[i]));
// 
    // fclose(stdin);
// 
    // std::vector<int> res = beechtree(N, M, P, C);
// 
    // int n = res.size();
    // for (int i = 0; i < n; ++i)
    // {
        // if (i > 0)
            // printf(" ");
        // printf("%d", res[i]);
    // }
    // printf("\n");
    // fclose(stdout);
// 
    // 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...