2 条题解

  • 0
    @ 2025-10-8 17:01:25

    zjy代码(scy微改):

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    int dep[N],fa[N],sonsiz[N];
     
    int main()
    {
        int n;scanf("%d",&n);
        memset(dep,0,sizeof(dep));
        memset(sonsiz,0,sizeof(sonsiz));
        for(int i=1,x;i<=n;i++)
        {
            scanf("%d",&fa[i]); 
            dep[i]=dep[fa[i]]+1;
            sonsiz[fa[i]]++;
        }
        int m=0;for(int i=1;i<=n;i++){if(sonsiz[i]==0)m++;}
     
        for(int i=1,x;i<=m;i++)
        {
            scanf("%d",&x);
            if(i==m){puts("0");continue;}
     
            x=fa[x];//目标是让x指向最后一个无法确认的点
            while(sonsiz[x]==1&&x!=0)x=fa[x];
            sonsiz[x]--;
            
            printf("%d\n",dep[x]+1);
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:01:18

      zjy代码(scy微改):

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e6+10;
      int dep[N],fa[N],sonsiz[N];
       
      int main()
      {
          int n;scanf("%d",&n);
          memset(dep,0,sizeof(dep));
          memset(sonsiz,0,sizeof(sonsiz));
          for(int i=1,x;i<=n;i++)
          {
              scanf("%d",&fa[i]); 
              dep[i]=dep[fa[i]]+1;
              sonsiz[fa[i]]++;
          }
          int m=0;for(int i=1;i<=n;i++){if(sonsiz[i]==0)m++;}
       
          for(int i=1,x;i<=m;i++)
          {
              scanf("%d",&x);
              if(i==m){puts("0");continue;}
       
              x=fa[x];//目标是让x指向最后一个无法确认的点
              while(sonsiz[x]==1&&x!=0)x=fa[x];
              sonsiz[x]--;
              
              printf("%d\n",dep[x]+1);
          }
          return 0;
      }
      • 1

      *【树上模拟】确定学生编号[USACO25FEB] Vocabulary Quiz S

      信息

      ID
      2583
      时间
      2000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      124
      已通过
      30
      上传者