Submission #1157424

#TimeUsernameProblemLanguageResultExecution timeMemory
1157424rayan_bdSeptember (APIO24_september)C++20
0 / 100
1095 ms320 KiB
#include <bits/stdc++.h>

using namespace std;


const int mxB = 5;
const int mxN = 15;
vector<int> adj[mxN];
int st[mxN],en[mxN],nxt[mxN],idx[mxN],lt[mxN],dp[mxB][mxN],rmax[mxN],timer=-1;

// next[u] -> index of the rightmost node that belongs to the u nodes subtree

void dfs(int u=0,int par=-1){
	st[u]=++timer;
	lt[timer]=idx[u];
	for(auto it:adj[u]){
		if(it^par){
			dfs(it,u);
		}
	}
	en[u]=timer;
}

void build_sparse(int N){
	for(int i=0;i<N;++i){
		dp[0][i]=lt[i];
	}
	for(int i=1;i<mxB;++i){
    	for(int j=0;j+(1<<i)<=N;++j){
    		dp[i][j]=max(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
    	}
    }
}

int qry(int l,int r){
	int cnt = r-l+1;
	int k=(int)(log(cnt)/log(2));
	return max(dp[k][l],dp[k][r-(1<<k)+1]);
}

void reset(int N){
	for(int i=0;i<=N;++i) adj[i].clear();
}

int solve(int N,int M,vector<int> F,vector<vector<int>> S){
	reset(N);

	for(int i=1;i<N;++i) adj[F[i]].push_back(i);
	for(int i=1;i<=S[0].size();++i) idx[S[0][i-1]]=i;

	dfs();
	build_sparse(N);

	for(int i=0;i<N;++i) nxt[i]=qry(st[i],en[i]);

	for(int i=1;i<=S[0].size();++i) rmax[i]=max(rmax[i-1],nxt[S[0][i-1]]);

	int idx=1,ans=0;

	while(idx<=S[0].size()){
		if(rmax[idx]==idx) ++ans,++idx;
		else idx=rmax[idx];
	}

	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...