记录编号 308497 评测结果 AAAAAAAAAAAAA
题目名称 [USACO Hol10] 政党 最终得分 100
用户昵称 GravatarKZNS 是否通过 通过
代码语言 C++ 运行时间 4.400 s
提交时间 2016-09-18 08:02:11 内存使用 18.24 MiB
显示代码纯文本
  1. //KZNS
  2. #include <cstdio>
  3. #include <vector>
  4. using namespace std;
  5. #define Nmax 200003
  6. #define Mmax 100003
  7. int N, M;
  8. vector<int> tr[Nmax], zd[Mmax];
  9. inline int input() {
  10. int ans = 0;
  11. char c = getchar();
  12. while (!('0' <= c && c <= '9'))
  13. c = getchar();
  14. while ('0' <= c && c <= '9') {
  15. ans = ans * 10 + c - '0';
  16. c = getchar();
  17. }
  18. return ans;
  19. }
  20. void rin() {
  21. N = input();
  22. M = input();
  23. int a, b;
  24. for (int i = 1; i <= N; i++) {
  25. a = input();
  26. b = input();
  27. zd[a].push_back(i);
  28. tr[b].push_back(i);
  29. }
  30. }
  31. int fas[Nmax][20] = {0};
  32. int ddp[Nmax] = {0};
  33. void DFS(int x, int dp) {
  34. ddp[x] = dp;
  35. int t;
  36. for (int i = 0; i < tr[x].size(); i++) {
  37. t = tr[x][i];
  38. fas[t][0] = x;
  39. DFS(t, dp+1);
  40. }
  41. }
  42. void lcafir() {
  43. for (int j = 1; j < 20; j++)
  44. for (int i = 1; i <= N; i++)
  45. fas[i][j] = fas[fas[i][j-1]][j-1];
  46. }
  47. inline int lca(int a, int b) {
  48. if (ddp[a] > ddp[b]) {
  49. for (int j = 19; j >= 0; j--)
  50. if (ddp[fas[a][j]] >= ddp[b])
  51. a = fas[a][j];
  52. }
  53. else {
  54. for (int j = 19; j >= 0; j--)
  55. if (ddp[fas[b][j]] >= ddp[a])
  56. b = fas[b][j];
  57. }
  58. if (a == b)
  59. return a;
  60. for (int j = 19; j >= 0; j--)
  61. if (fas[a][j] != fas[b][j])
  62. a = fas[a][j], b = fas[b][j];
  63. return fas[a][0];
  64. }
  65. void fir() {
  66. DFS(0, 0);
  67. lcafir();
  68. }
  69. void work() {
  70. int a, b, t;
  71. int ans;
  72. int dis;
  73. for (int i = 1; i <= M; i++) {
  74. a = zd[i][0];
  75. ans = 0;
  76. for (int j = 1; j < zd[i].size(); j++) {
  77. t = zd[i][j];
  78. dis = ddp[a] + ddp[t] - 2 * ddp[lca(a, t)];
  79. if (dis > ans) {
  80. ans = dis;
  81. b = t;
  82. }
  83. }
  84. for (int j = 1; j < zd[i].size(); j++) {
  85. t = zd[i][j];
  86. ans = max(ans, ddp[b] + ddp[t] - 2 * ddp[lca(b, t)]);
  87. }
  88. printf("%d\n", ans);
  89. }
  90. }
  91. int main() {
  92. freopen("cowpol.in", "r", stdin);
  93. freopen("cowpol.out", "w", stdout);
  94. rin();
  95. fir();
  96. work();
  97. return 0;
  98. }
  99. //UBWH