Guest User

Untitled

a guest
Dec 9th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. #include "grader.h"
  2.  
  3. // int getN(): gets the value of N.
  4. // int getQ(): gets the value of Q.
  5. // void setFarmLocation(int ID, int X, int Y): determines that Farmer John should build farm ID (0≤ID≤N−1) at location (X,Y) where (1≤X,Y≤N). Should only be called from buildFarms.
  6. // void addBox(int X1, int Y1, int X2, int Y2): adds a box to notify Farmer John where (1≤X1≤X2≤N) and (1≤Y1≤Y2≤N). Should only be called from notifyFJ.
  7.  
  8. // MEMORY LIMIT: 512 MB
  9. // (increased from usual 256 MB)
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12.  
  13. const int maxn = 1e5;
  14. const int LOG = 20;
  15.  
  16. int n, q;
  17.  
  18. vector<int> adj[maxn];
  19. int bl[maxn][LOG];
  20. int dpth[maxn];
  21. int subsz[maxn];
  22. pair<int,int> coords[maxn];
  23.  
  24. void add_edge(int a, int b) {
  25. adj[a].push_back(b);
  26. adj[b].push_back(a);
  27. }
  28.  
  29. int getsubsz(int nd, int par) {
  30. subsz[nd] = 1;
  31. for (auto i : adj[nd])
  32. if (i != par)
  33. subsz[nd] += getsubsz(i, nd);
  34. return subsz[nd];
  35. }
  36.  
  37. void init(int nd, int d) {
  38. dpth[nd] = d;
  39. for (int i = 1; i < LOG; i++)
  40. bl[nd][i] = bl[bl[nd][i - 1]][i - 1];
  41. for (auto i : adj[nd])
  42. if (i != bl[nd][0]) {
  43. bl[i][0] = nd;
  44. init(i, d + 1);
  45. }
  46. }
  47.  
  48. int jmp(int nd, int k) {
  49. for (int i = 0; i < LOG; i++)
  50. if (1 & (k >> i))
  51. nd = bl[nd][i];
  52. return nd;
  53. }
  54. int lca(int a, int b) {
  55. if (dpth[a] > dpth[b])
  56. swap(a, b); // dpth[b] > dpth[a] now
  57. b = jmp(b, dpth[b] - dpth[a]);
  58. if (a == b)
  59. return a;
  60. for (int i = LOG - 1; i >= 0; i--) {
  61. int A = bl[a][i], B = bl[b][i];
  62. if (A != B)
  63. a = A, b = B;
  64. }
  65. return bl[a][0];
  66. }
  67.  
  68.  
  69. int edges_added = 0;
  70. void addRoad(int a, int b) {
  71. n = getN();
  72. q = getQ();
  73.  
  74. add_edge(a, b);
  75. edges_added++;
  76.  
  77. if (edges_added == n - 1)
  78. init(0, 0);
  79. }
  80.  
  81. int place(int nd, int a, int b) {
  82. setFarmLocation(nd, a, b);
  83. coords[nd] = {a, b};
  84. a += subsz[nd], b++;
  85. for (auto i : adj[nd])
  86. if (i != bl[nd][0]) {
  87. a -= subsz[i];
  88. b = place(i, a, b);
  89. }
  90. return b;
  91. }
  92.  
  93. void buildFarms() {
  94. getsubsz(0, -1);
  95. place(0, 1, 1);
  96. }
  97.  
  98. pair<pair<int,int>, pair<int,int>> getBOX(int a, int b) {
  99. return {coords[a], coords[b]};
  100. }
  101.  
  102. void callBox(int a, int b) {
  103. auto x = getBOX(a, b);
  104. addBox(x.first.first, x.first.second, x.second.first, x.second.second);
  105. }
  106.  
  107. void notifyFJ(int a, int b) {
  108. int c = lca(a, b);
  109. if (c == a) swap(a, b);
  110. if (c == b) {
  111. callBox(c, a);
  112. } else {
  113. callBox(c, a);
  114. callBox(jmp(b, dpth[b] - dpth[c] - 1), b);
  115. }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment