Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <vector>
  5. #include <array>
  6. #include <algorithm>
  7. #include <utility>
  8. #include <map>
  9. #include <queue>
  10. #include <set>
  11. #include <cmath>
  12. #include "grader.h"
  13.  
  14. #define ll long long
  15. #define eps 1e-8
  16. #define MOD 1000000007
  17.  
  18. #define INF 0x3f3f3f3f
  19. #define INFLL 0x3f3f3f3f3f3f3f3f
  20.  
  21. // change if necessary
  22. #define MAXN 100000
  23.  
  24. using namespace std;
  25.  
  26. int n, q;
  27. vector<int> adj[MAXN];
  28. pair<int, int> loc[MAXN];
  29. int sz[MAXN];
  30.  
  31. // lca stuff
  32. int t;
  33. int in[MAXN];
  34. int out[MAXN];
  35. int up[MAXN][18];
  36.  
  37.  
  38. void dfs(int v, int p) {
  39.     in[v] = t++;
  40.  
  41.     sz[v] = 1;
  42.     for (int e : adj[v]) {
  43.         if (e != p) {
  44.             dfs(e, v);
  45.             sz[v] += sz[e];
  46.         }
  47.     }
  48.  
  49.     up[v][0] = p;
  50.     for (int i = 1; i < 18; i++) {
  51.         up[v][i] = up[up[v][i - 1]][i - 1];
  52.     }
  53.  
  54.     out[v] = t++;
  55. }
  56.  
  57. void dfs2(int v, int p) {
  58.     int curX = loc[v].first;
  59.     int curY = loc[v].second + sz[v];
  60.  
  61.     for (int e : adj[v]) {
  62.         if (e != p) {
  63.             curX++;
  64.             curY--;
  65.             curY -= sz[e] - 1;
  66.             loc[e].first = curX;
  67.             loc[e].second = curY;
  68.             curX += sz[e] - 1;
  69.             dfs2(e, v);
  70.         }
  71.     }
  72. }
  73.  
  74. bool is_ancestor(int p, int c) {
  75.     return in[p] <= in[c] && out[c] <= out[p];
  76. }
  77.  
  78. pair<int, int> lca(int a, int b) {
  79.     if (is_ancestor(a, b)) {
  80.         return {a, -1};
  81.     }
  82.  
  83.     if (is_ancestor(b, a)) {
  84.         return {b, -1};
  85.     }
  86.  
  87.     for (int i = 17; i >= 0; i--) {
  88.         if (!is_ancestor(up[a][i], b)) {
  89.             a = up[a][i];
  90.         }
  91.     }
  92.    
  93.     return {up[a][0], a};
  94. }
  95. void addRoad(int a, int b) {
  96.     adj[a].push_back(b);
  97.     adj[b].push_back(a);
  98. }
  99.  
  100. void buildFarms() {
  101.     n = getN();
  102.     q = getQ();
  103.     dfs(0, 0);
  104.  
  105.     loc[0] = {1, 1};
  106.     dfs2(0, 0);
  107.     for (int i = 0; i < n; i++) {
  108.         setFarmLocation(i, loc[i].first, loc[i].second);
  109.     }
  110. }
  111.  
  112. void notifyFJ(int a, int b) {
  113.     auto res = lca(a, b);
  114.     if (res.second == -1) {
  115.         int minX = min(loc[a].first, loc[b].first);
  116.         int minY = min(loc[a].second, loc[b].second);
  117.         int maxX = max(loc[a].first, loc[b].first);
  118.         int maxY = max(loc[a].second, loc[b].second);
  119.         addBox(minX, minY, maxX, maxY);
  120.     } else {
  121.         int minX = min(loc[res.first].first, loc[b].first);
  122.         int minY = min(loc[res.first].second, loc[b].second);
  123.         int maxX = max(loc[res.first].first, loc[b].first);
  124.         int maxY = max(loc[res.first].second, loc[b].second);
  125.         addBox(minX, minY, maxX, maxY);
  126.         minX = min(loc[res.second].first, loc[a].first);
  127.         minY = min(loc[res.second].second, loc[a].second);
  128.         maxX = max(loc[res.second].first, loc[a].first);
  129.         maxY = max(loc[res.second].second, loc[a].second);
  130.         addBox(minX, minY, maxX, maxY);
  131.     }
  132. }
  133.  
  134.  
  135. int main() {
  136.     N = 7;
  137.     Q = 3;
  138.     addRoad(0, 1);
  139.     addRoad(0, 2);
  140.     addRoad(0, 3);
  141.     addRoad(0, 4);
  142.     addRoad(0, 5);
  143.     addRoad(0, 6);
  144.     buildFarms();
  145.     notifyFJ(4, 2);
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement