比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAAAAA
题目名称 政党 最终得分 100
用户昵称 NVIDIA 运行时间 4.375 s
代码语言 C++ 内存使用 19.48 MiB
提交时间 2016-10-07 18:42:54
显示代码纯文本
  1. #include <algorithm>
  2. #include <vector>
  3. #include <iostream>
  4. #include <queue>
  5. #include <cstdio>
  6. #define N 200010
  7. #define M 20
  8. using namespace std;
  9. int n,K;
  10. vector<int> G[N];
  11. vector<int> F[N];
  12. int deep[N]={0};
  13. int p[N][M]={0};
  14. bool l[N]={0};
  15. int o;
  16. void BFS(int s)
  17. {
  18. int i,u,v;
  19. queue<int> q;
  20. for(i=1;i<=n;i++)l[i]=0;
  21. q.push(s);
  22. while(!q.empty())
  23. {
  24. u=q.front();
  25. q.pop();
  26. l[u]=1;
  27. for(i=0;i<G[u].size();i++)
  28. {
  29. v=G[u][i];
  30. if(!l[v])
  31. {
  32. p[v][0]=u;
  33. deep[v]=deep[u]+1;
  34. q.push(v);
  35. }
  36. }
  37. }
  38. }
  39. void LCB(int u)
  40. {
  41. int i,v;
  42. l[u]=1;
  43. for(i=1;i<M;i++)
  44. {
  45. p[u][i]=p[p[u][i-1]][i-1];
  46. if(!p[u][i])break;
  47. }
  48. for(i=0;i<G[u].size();i++)
  49. {
  50. v=G[u][i];
  51. if(!l[v])LCB(v);
  52. }
  53. }
  54. int LCA(int u,int v)
  55. {
  56. int i,d,t;
  57. if(deep[u]<deep[v])
  58. {
  59. t=u;
  60. u=v;
  61. v=t;
  62. }
  63. d=deep[u]-deep[v];
  64. for(i=0;i<M;i++)if((1<<i)&d)u=p[u][i];
  65. if(u==v)return u;
  66. for(i=M-1;i>=0;i--)
  67. {
  68. if(p[u][i]!=p[v][i])
  69. {
  70. u=p[u][i];
  71. v=p[v][i];
  72. }
  73. }
  74. u=p[u][0];
  75. return u;
  76. }
  77. int dis(int u,int v)
  78. {
  79. int fa,ans=0;
  80. fa=LCA(u,v);
  81. ans=deep[u]+deep[v]-2*deep[fa];
  82. return ans;
  83. }
  84. void read()
  85. {
  86. int i,j,u,v,w;
  87. cin>>n>>K;
  88. for(i=1;i<=n;i++)
  89. {
  90. u=i;
  91. cin>>w>>v;
  92. F[w].push_back(i);
  93. if(v==0)continue;
  94. G[u].push_back(v);
  95. G[v].push_back(u);
  96. }
  97. BFS(1);
  98. for(i=1;i<=n;i++)l[i]=0;
  99. LCB(1);
  100. }
  101. void make(int s)
  102. {
  103. int i,j,u,v;
  104. int temp=0,best=0,st=0,en=0;
  105. u=F[s][0];
  106. for(i=0;i<F[s].size();i++)
  107. {
  108. v=F[s][i];
  109. temp=dis(u,v);
  110. if(temp>best)
  111. {
  112. best=temp;
  113. st=v;
  114. }
  115. }
  116. best=0;
  117. for(i=0;i<F[s].size();i++)
  118. {
  119. v=F[s][i];
  120. temp=dis(st,v);
  121. if(temp>best)
  122. {
  123. best=temp;
  124. en=v;
  125. }
  126. }
  127. cout<<best<<endl;
  128. }
  129. void work()
  130. {
  131. int i,j;
  132. for(i=1;i<=K;i++)make(i);
  133. }
  134. int main()
  135. {
  136. freopen("cowpol.in","r",stdin);
  137. freopen("cowpol.out","w",stdout);
  138. read();
  139. work();
  140. return 0;
  141. }