#include "september.h"
#include<bits/stdc++.h>
using namespace std;
const int LM=100100;
int pw[LM], pk[LM], pks[LM], n;
int ch[LM];
vector<int> child[LM];
int ldfs;
void C(int N, int M, vector<int>F, vector<vector<int>> S){
for(int i=0; i<=N; i++){
child[i].clear();
pw[i]=0;
ch[i]=0;
}
for(int i=1; i<N; i++)
child[F[i]].push_back(i);
n=N;
ldfs=1;
}
void dfs(int x){
int s=ldfs;
for(int y:child[x])
dfs(y);
pks[ldfs]=s;
pk[x] = ldfs++;
}
void updt_pw(int x){
for(int i=x; i<=n; i+=(i&-i))
pw[i]++;
}
int find_pw(int x){
int ret=0;
for(int i=x; i>0; i-=(i&-i))
ret += pw[i];
for(int i=pks[x]-1; i>0; i-=(i&-i))
ret -= pw[i];
return ret==x-pks[x]+1;
}
int solve(int N, int M, vector<int>F, vector<vector<int>> S){
C(N, M, F, S);
dfs(0);
int ans=0;
queue<int> q;
int h=0;
for(int i=0; i<n-1; i++){
for(int j=0; j<M; j++){
int s=S[j][i];
ch[s]++;
h += ch[s]==M;
if(ch[s]>1) continue;
updt_pw(pk[s]);
if(!find_pw(pk[s]))
q.push(pk[s]);
}
if(h==i+1){
while(!q.empty() && find_pw(q.front()))
q.pop();
ans += q.empty();
}
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |