比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
政党 |
最终得分 |
100 |
用户昵称 |
Hzoi_chairman |
运行时间 |
4.048 s |
代码语言 |
C++ |
内存使用 |
26.10 MiB |
提交时间 |
2016-10-07 16:44:50 |
显示代码纯文本
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=200100;
int read()
{
int x,f=1;
char ch;
while(ch=getchar(),!isdigit(ch))
{
if(ch=='-')f=-1;
}
x=ch-48;
while(ch=getchar(),isdigit(ch))
{
x=x*10+ch-48;
}
return x*f;
}
void write(int x)
{
if(x<0)putchar('-'),x=-x;
int cnt=0;char ch[30];
while(ch[++cnt]=x%10+48,x/=10);
while(putchar(ch[cnt]),--cnt);
putchar('\n');
}
struct edge
{
int f,t,n;
}a[maxn];
struct zheng
{
int num,n;
}e[maxn];
int cnt,last[maxn];
int len,head[maxn];
void insert(int x,int y)
{
a[++len].f=x;a[len].t=y;a[len].n=head[x];head[x]=len;
}
int n,m,D,ans[maxn],rt[maxn],fa[maxn][30],d[maxn];
#define k a[i].t
void dfs(int x)
{
for(int i=head[x];i;i=a[i].n)
{
if(fa[x][0]==k)continue;
d[k]=d[x]+1;
fa[k][0]=x;
dfs(k);
}
}
#undef k
int lca(int x,int y)
{
if(d[x]<d[y])swap(x,y);
for(int j=D;j>=0;j--)
{
if(d[fa[x][j]]>=d[y])
{
x=fa[x][j];
}
}
if(x==y)return x;
for(int j=D;j>=0;j--)//注意要找到等于0
{
if(fa[x][j]!=fa[y][j])
{
x=fa[x][j];y=fa[y][j];
}
}
return fa[x][0];
}
int main()
{
freopen("cowpol.in","r",stdin);
freopen("cowpol.out","w",stdout);
n=read(),m=read();
int root=0;
for(int i=1;i<=n;i++)
{
int x=read(),y=read();
if(!y)root=i;
else insert(y,i);
e[++cnt].num=i;
e[cnt].n=last[x];
last[x]=cnt;
}
d[root]=1;
dfs(root);
D=log(n*1.0)/log(2.0);
for(int j=1;j<=D;j++)
{
for(int i=1;i<=n;i++)
{
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
for(int j=1;j<=m;j++)
{
int x=e[last[j]].num;
int maxx=0,a=0;
for(int i=last[j];i;i=e[i].n)
{
int k=e[i].num;
if(k==x)continue;
int l=lca(x,k);
if(maxx<d[x]+d[k]-2*d[l])maxx=d[x]+d[k]-2*d[l],a=k;
}
int ans=0;x=a;
for(int i=last[j];i;i=e[i].n)
{
int k=e[i].num;
if(k==x)continue;
int l=lca(x,k);
if(ans<d[x]+d[k]-2*d[l])ans=d[x]+d[k]-2*d[l];
}
write(ans);
}
//system("pause");
}