Submission #1188205

#TimeUsernameProblemLanguageResultExecution timeMemory
1188205dzuizzSeptember (APIO24_september)C++20
0 / 100
2 ms3140 KiB
#include "september.h"
#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN=1e5+5;
int fw[MAXN],n;
vector<int> adj[MAXN];
int pre[MAXN],pos[MAXN],ss[MAXN],_ptr;
void add(int idx,int d){
  for(++idx;idx<MAXN;idx+=idx&-idx)
    fw[idx]+=d;
}
int sum(int idx){
  int ret=0;
  for(++idx;idx>0;idx-=idx&-idx)
    ret+=fw[idx];
  return ret;
}
int sum(int l,int r){ return sum(r)-sum(l-1); }
void dfs_init(int i){
  pre[i]=++_ptr;
  ss[i]=1;
  for(auto&x:adj[i]){
    dfs_init(x);
    ss[i]+=ss[x];
  }
  pos[i]=_ptr;
}
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
  // M = 1
  for(int i=1;i<N;++i) adj[F[i]].emplace_back(i);
  dfs_init(0);
  memset(fw,0,sizeof fw);

  int ans=0;
  for(int i=0,j;i<N-1;i=j){
    //cout<<i<<'\n';
    int x=S[0][i];
    ++ans;
    add(pre[x],1);
    for(j=i+1;sum(pre[x],pos[x])<ss[x];++j){
      //cout<<">> "<<sum(pre[x],pos[x])<<'\n';
      if(j>=N) break;
      add(pre[S[0][j]],1);
    }
  }
#ifdef DEBUG
  for(int i=0;i<N;++i){
    cout<<pos[i]<<" ";
    cout<<sum(pre[i],pre[i])<<" ";
  }
  cout<<'\n';
#endif
	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...