比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAAAEE
题目名称 政党 最终得分 84
用户昵称 SOBER GOOD BOY 运行时间 2.173 s
代码语言 C++ 内存使用 40.43 MiB
提交时间 2016-10-07 16:46:54
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

const int maxn=800000+100;

vector<int> zd[maxn];
vector<int> g[maxn];

int Ans[maxn],belong[maxn],dist[maxn],top[maxn],deep[maxn],fa[maxn];

int sz[maxn],son[maxn];

int N,M,root=1,cnt=0;

bool vis[maxn];

void dfs1(int x)
{
     sz[x]=1;
     int len=g[x].size();
     for(int t,i=0;i<len;i++)
     {
      t=g[x][i];
      if(!sz[t])
      {
            deep[t]=deep[x]+1;
            dist[t]=dist[x]+1;
            fa[t]=x;
             dfs1(t);
             sz[x]+=sz[t];
             if(sz[t]>sz[son[x]])
             son[x]=t;   
      }
     }
}
void dfs2(int x,int tp)
{
     vis[x]=1;
     top[x]=tp;
     if(son[x])dfs2(son[x],tp);
     int len=g[x].size();
     for(int t,i=0;i<len;i++)
     {
       t=g[x][i];
       if(!vis[t])
       {   
           dfs2(t,t);       
       }
     }
}

int lca(int x,int y)
{
    int ha1=x,ha2=y,LCA;
    for(;;)
    {
        if(top[ha1]==top[ha2])
        {
         if(deep[ha1]<deep[ha2])
         LCA=ha1;
         else LCA=ha2;
        break;
       }
       if(deep[top[ha1]]<deep[top[ha2]])
       {
       ha2=fa[top[ha2]];continue;
       }
       else ha1=fa[top[ha1]];
    }
    return (dist[x]+dist[y]-2*dist[LCA]);
}

int main()
{
    freopen("cowpol.in","r",stdin);
    freopen("cowpol.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int x,i=1;i<=N;i++)
    {
      scanf("%d%d",&belong[i],&x);
      if(!x)root=i;
      else g[x].push_back(i);
      zd[belong[i]].push_back(i);      
    }
    deep[root]=1;
    dist[root]=0;
    //vis[root]=1;
    //fa[root]=root;
    dfs1(root);
    dfs2(root,root);
    //for(int i=1;i<=N;i++)printf("%d\n",deep[i]);
    /*for(int i=1;i<=100;i++)
    {
            printf("%d fa %d  top %d son %d size %d \n",i,fa[i],top[i],son[i],sz[i]);
    }*/
    for(int len, ma,i=1;i<=M;i++)
    {
            int mi=-1;
            len=zd[i].size();
            if(len<2)
            {
                     puts("0");continue;
            }
            else 
            {
                for(int t,ch,j=1;j<len;j++)
                {
                        t=zd[i][j];
                        ch=lca(zd[i][0],t);
                        if(ch>mi)
                        {
                           mi=ch;
                           ma=t;      
                        }
                }
                for(int t,ch,j=1;j<len;j++)
                {
                    t=zd[i][j];
                    if(t!=ma)
                    {
                     ch=lca(ma,t);
                     mi=max(ch,mi);
                    }    
                } 
                printf("%d\n",mi);
            }
    }
    //tar(root);//puts("OK");
    //for(int i=1;i<=M;i++)
    //printf("%d\n",Ans[i]);
    fclose(stdin);
    fclose(stdout);
    //while(1);
    return 0;
}