Submission #1192376

#TimeUsernameProblemLanguageResultExecution timeMemory
1192376kangsanSeptember (APIO24_september)C++20
100 / 100
139 ms17600 KiB
#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 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...