Submission #1157486

#TimeUsernameProblemLanguageResultExecution timeMemory
1157486rayan_bdSeptember (APIO24_september)C++20
59 / 100
172 ms93888 KiB
#include <bits/stdc++.h>

using namespace std;


const int mxB = 28;
const int mxN = 1e5+1000;
const int mxK = 6;
vector<int> adj[mxN];
int st[mxN],en[mxN],nxt[mxN][mxK],idx[mxN][mxK],lt[mxN][mxK],dp[mxK][mxB][mxN],rmax[mxN][mxK],lg[mxN],timer=-1,K,prev_calc=1;

void dfs(int u=0,int par=-1){
	st[u]=++timer;
	for(int j=0;j<K;++j) lt[timer][j]=idx[u][j];
	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){
		for(int j=0;j<K;++j){
			dp[j][0][i]=lt[i][j];
		}
	}
	for(int k=0;k<K;++k){
		for(int i=1;i<mxB;++i){
    		for(int j=0;j+(1<<i)<=N;++j){
    			dp[k][i][j]=max(dp[k][i-1][j],dp[k][i-1][j+(1<<(i-1))]);
    		}
    	} 
    }
}

void calc_log(int N){
	while(prev_calc<=N){
		lg[prev_calc]=__lg(prev_calc);
		++prev_calc;
	}
}

int qry(int l,int r,int ck){
	int cnt=r-l+1;
	return max(dp[ck][lg[cnt]][l],dp[ck][lg[cnt]][r-(1<<lg[cnt])+1]);
}

void reset(int N){
	timer=-1;
	for(int i=0;i<=N+5;++i){
		adj[i].clear();
		for(int j=0;j<=K;++j){
			for(int k=0;k<mxB;++k){
				dp[j][k][i]=rmax[i][j]=lt[i][j]=nxt[i][j]=idx[i][j]=0ll;
			}
		}
	}
}

int solve(int N,int M,vector<int> F,vector<vector<int>> S){
	K=S.size();
	reset(N);

	for(int i=1;i<N;++i) adj[F[i]].push_back(i);

	for(int i=0;i<K;++i){
		for(int j=1;j<=S[i].size();++j){
			idx[S[i][j-1]][i]=j;
		}
	}

	dfs();
	build_sparse(N);
	calc_log(N);

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

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

	int idx=1,ans=1,sz=S[0].size();

	while(idx<sz){
		int mx=idx;
		for(int j=0;j<K;++j) mx=max(rmax[idx][j],mx);
		if(mx==idx) ++ans,++idx;
		else idx=mx;
	}

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