比赛 |
防止浮躁的小练习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;
}