Submission #844190

#TimeUsernameProblemLanguageResultExecution timeMemory
844190MrBrionixBeech Tree (IOI23_beechtree)C++17
9 / 100
1918 ms2097152 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 200'000;
vector<pair<int, int>> grafo[MAXN], opz[MAXN];
int m, col[MAXN], p[MAXN];
bool ok[MAXN];

vector<map<int,int>> freq[MAXN];
int num[MAXN];

bool comp(map<int,int> x,map<int,int> y){
    return x.size()>y.size();
}

void dfs(int nodo){
    
    vector<int> tmp;
    
    ok[nodo]=true;
    freq[nodo].push_back(map<int,int>());
    
    for(auto [to,c] : grafo[nodo]){
        dfs(to);
        
        ok[nodo]&=ok[to];
        for(auto x : freq[to])
        freq[nodo].push_back(x);
        
        freq[nodo][0][c]++;
        tmp.push_back(c);
    }
    
    if(!ok[nodo])return;
    
    sort(freq[nodo].begin()+1,freq[nodo].end(),comp);
    sort(tmp.begin(),tmp.end());
    
    
    for(int i=1;i<tmp.size();i++){
        if(tmp[i]==tmp[i-1])ok[nodo]=false;
    }
    
    for(int i=1;i<freq[nodo].size();i++){
        for(auto [x,y] : freq[nodo][i]){
            if(y>freq[nodo][i-1][x])ok[nodo]=false;
        }
    }
}

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
	m = M;
	for (int i = 1; i <= N - 1; i++) {
		grafo[P[i]].emplace_back(i, C[i]);
		p[i] = P[i];
	}

	dfs(0);

	vector<int> ans;
	for (int i = 0; i < N; i++) {
		ans.push_back(ok[i]);
	}
	return ans;
}

/*
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;
}
*/

Compilation message (stderr)

beechtree.cpp: In function 'void dfs(int)':
beechtree.cpp:40:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |     for(int i=1;i<tmp.size();i++){
      |                 ~^~~~~~~~~~~
beechtree.cpp:44:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::map<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |     for(int i=1;i<freq[nodo].size();i++){
      |                 ~^~~~~~~~~~~~~~~~~~
#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...