제출 #1158694

#제출 시각아이디문제언어결과실행 시간메모리
1158694rayan_bdSeptember (APIO24_september)C++20
0 / 100
1096 ms2880 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=M; reset(N); for(int i=1;i<N;++i) adj[F[i]].push_back(i); for(int i=0;i<M;++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<M;++i){ for(int j=0;j<N;++j){ nxt[j][i]=qry(st[j],en[j],i); } } for(int i=0;i<M;++i){ for(int j=1;j<=N-1;++j){ rmax[j][i]=max(rmax[j-1][i],nxt[S[i][j-1]][i]); } } int mx_p=1,ans=1; vector<int> points(M,1); while(mx_p<N-1){ vector<int> curr_point(M,1); int na=0; for(int j=0;j<M;++j) curr_point[j]=points[j]; for(int j=0;j<M;++j){ if(curr_point[j]==rmax[curr_point[j]][j]) ++na,++curr_point[j]; curr_point[j]=max(curr_point[j],rmax[curr_point[j]][j]); mx_p=max(mx_p,curr_point[j]); } if(na==M) ++ans; } 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...