倍增求祖先+DSU on tree WA on #8 求助
查看原帖
倍增求祖先+DSU on tree WA on #8 求助
222865
迟暮天复明心華楼主2023/4/8 09:40

rt.但是不知道发生了什么。

struct edge{
  int to,nxt;
}e[200010];
struct Query{
  int v,p,ans;
}ask[200010];
struct QQuery{
  int ans,dep,id;
};std::vector<QQuery>query[200010];
int cnt,dfncnt,head[100010],size[100010],bigc[100010];
int col[200010],num[200010],llim[200010],rlim[200010];
int dfn[200010],fath[200010];
int ance[20][200010];

void add(int u,int v){
  e[++cnt].to=v;
  e[cnt].nxt=head[u];
  head[u]=cnt;
}
void add(int u){++num[col[u]];}
void del(int u){--num[col[u]];}
int getans(int dep){return num[dep];}
void dfs0(int u,int fa){
  dfn[++dfncnt]=u,llim[u]=dfncnt,size[u]=1,col[u]=col[fa]+1;
  for(int i=head[u];i;i=e[i].nxt){
    dfs0(e[i].to,u),size[u]+=size[e[i].to];
    if(bigc[u]==0||size[bigc[u]]<size[e[i].to])bigc[u]=e[i].to;
  }rlim[u]=dfncnt;ance[0][u]=fa;for(int i=1;i<=18;++i)ance[i][u]=ance[i-1][ance[i-1][u]];
}
void dfs1(int u,int fa,bool keep){
  for(int i=head[u];i;i=e[i].nxt)if(e[i].to!=bigc[u])
    dfs1(e[i].to,u,0);
  if(bigc[u])dfs1(bigc[u],u,1);
  for(int i=head[u];i;i=e[i].nxt)if(e[i].to!=bigc[u])
    for(int j=llim[e[i].to];j<=rlim[e[i].to];++j)add(dfn[j]);
  add(u);for(auto &i:query[u])i.ans=getans(i.dep)-1;
  if(!keep)for(int i=llim[u];i<=rlim[u];++i)del(dfn[i]);
}

signed main() {
  clock_t c1 = clock();
#ifdef LOCAL
  freopen("in.in", "r", stdin);
  freopen("out.out", "w", stdout);
#endif
//------------------------------------------------------------------

  int n,m;read(n);
  for(int i=1;i<=n;++i){
    read(fath[i]);
    if(fath[i]!=0)add(fath[i],i);
  }read(m);
  for(int i=1;i<=m;++i)read(ask[i].v),read(ask[i].p);
  for(int i=1;i<=n;++i)if(fath[i]==0)dfs0(i,0);
  for(int i=1;i<=m;++i){
    int pp=ask[i].p,now=ask[i].v;
    //if(col[now]<=pp){ask[i].ans=0;continue;};
    for(int j=18;j>=0;--j)if(pp>=(1<<j)){
      pp-=(1<<j);now=ance[j][now];
    }query[now].push_back({0,col[ask[i].v],i});
    debug("%d %d %d\n",ask[i].p,ask[i].v,now);
  }
  for(int i=1;i<=n;++i)if(fath[i]==0){memset(num,0,sizeof(num));dfs1(i,0,0);}
  for(int i=1;i<=n;++i)for(auto j:query[i])ask[j.id].ans=j.ans;
  for(int i=1;i<=m;++i)print(ask[i].ans,' '); 

//------------------------------------------------------------------
end:
  std::cerr << "Time : " << clock() - c1 << " ms" << std::endl;
  return 0;
}
2023/4/8 09:40
加载中...