比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
政党 |
最终得分 |
100 |
用户昵称 |
NewBee |
运行时间 |
0.701 s |
代码语言 |
C++ |
内存使用 |
16.33 MiB |
提交时间 |
2016-10-07 16:43:12 |
显示代码纯文本
#include<cstdio>
#include<vector>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("cowpol.in","r",stdin);freopen("cowpol.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=300010;
vector<int> ve[maxn];
struct QUEUE{
int head,tail,q[maxn];
int F(int x){
return ((x%maxn)+maxn)%maxn;
}
void push(int x){
q[F(++tail)]=x;
}
int pop(){
head++;
return q[F(head-1)];
}
bool empty(){
return head>tail;
}
}q;
struct op{
int to,next;
}r[maxn<<1];
int head[maxn],tim,deep[maxn],son[maxn],top[maxn],size[maxn],fath[maxn],n,k;
void dfs1(int rt){
size[rt]=1;
int y;
for(int i=head[rt];i;i=r[i].next){
y=r[i].to;
if(size[y])continue;
fath[y]=rt;
deep[y]=deep[rt]+1;
dfs1(y);
if(size[y]>size[son[rt]])son[rt]=y;
size[rt]+=size[y];
}
}
void dfs2(int rt,int tp){
top[rt]=tp;
int y;
if(son[rt])dfs2(son[rt],tp);
for(int i=head[rt];i;i=r[i].next){
y=r[i].to;
if(top[y])continue;
dfs2(y,y);
}
}
void insert(int fr,int to){
tim++;
r[tim].to=to;
r[tim].next=head[fr];
head[fr]=tim;
}
void swap(int& x,int& y){
int timee=x;
x=y;y=timee;
}
int lca(int u,int v){
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]])swap(u,v);
u=fath[top[u]];
}
if(deep[u]>deep[v])swap(u,v);
return u;
}
void getdis(int par){
int u,v,t,disu=0,disx;
int sizz=ve[par].size();
v=ve[par][0];
for(int i=1;i<sizz;i++){
t=lca(v,ve[par][i]);
disx=deep[v]+deep[ve[par][i]]-2*deep[t];
if(disx>disu){
u=ve[par][i];
disu=disx;
}
}
swap(u,v);
disu=0;
for(int i=0;i<sizz;i++){
t=lca(v,ve[par][i]);
disx=deep[v]+deep[ve[par][i]]-2*deep[t];
if(disx>disu){
u=ve[par][i];
disu=disx;
}
}
printf("%d\n",disu);
}
void chul(){
scanf("%d%d",&n,&k);
int p,a;
int rt;
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&p);
ve[a].push_back(i);
if(p==0){
rt=i;
}
else{
insert(p,i);
}
}
deep[rt]=1;
dfs1(rt);
fath[rt]=rt;
dfs2(rt,rt);
for(int i=1;i<=k;i++)getdis(i);
}
int main(){
Begin;
}