Advertisement
erfanul007

587. Erect the Fence

Nov 19th, 2022
946
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. typedef int T;
  2. #define all(v)          v.begin(), v.end()
  3. #define unq(v)          sort(all(v)),(v).resize(unique(all(v))-v.begin())
  4. #define pb              push_back
  5. struct PT{
  6.     T x, y;
  7.  
  8.     PT(){}
  9.     PT(T x, T y) : x(x), y(y) {}
  10.     inline bool operator == (const PT &p) const {
  11.         return x == p.x && y == p.y;
  12.     }
  13.     inline bool operator < (const PT &p) const {
  14.         return ((x < p.x) || (x == p.x && y < p.y));
  15.     }
  16. }_f;
  17.  
  18. const double eps = 1e-9;
  19.  
  20. inline PT operator - (const PT &u, const PT &v) {
  21.     return PT(u.x - v.x, u.y - v.y);
  22. }
  23. T sqnorm(const PT &u) {
  24.     return (u.x * u.x) + (u.y * u.y);
  25. }
  26. /* line ab to point c */
  27. int orientation(const PT &a, const PT &b, const PT &c) {
  28.     T val = (b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y);
  29.     if(abs(val) < eps) return 0;      // 0 linear
  30.     return val > eps ? 1 : -1;    // + ccw, - acw
  31. }
  32. bool AClockCmp(const PT &a, const PT &b){
  33.     int val = orientation(_f, a, b);
  34.     if(val == 0) return sqnorm(a - _f) < sqnorm(b - _f);
  35.     return val < 0;
  36. }
  37. vector< PT > GrahamScan(vector< PT >& v){
  38.     if(v.size() < 3) return v;
  39.     _f = v[0];
  40.     int pivot = 0;
  41.     for(int i=1; i<v.size(); i++){
  42.         if(v[i].y < _f.y) _f = v[i], pivot = i;
  43.         else if(v[i].y == _f.y && v[i].x < _f.x) _f = v[i], pivot = i;
  44.     }
  45.     swap(v[0], v[pivot]);
  46.     sort(v.begin()+1, v.end(), AClockCmp);
  47.     vector< PT > hull;
  48.     hull.pb(v[0]); hull.pb(v[1]);
  49.     for(int i=2; i<v.size(); i++){
  50.         while(hull.size() > 1 && orientation(hull[hull.size()-2], hull.back(), v[i]) > 0) hull.pop_back();
  51.         hull.pb(v[i]);
  52.     }
  53.     for(int i=v.size()-2; i>=0; i--){
  54.         if(orientation(hull.back(), hull[0], v[i]) == 0) hull.pb(v[i]);
  55.         else break;
  56.     }
  57.     unq(hull);
  58.     return hull;
  59. }
  60.  
  61. class Solution {
  62. public:
  63.     vector<vector<int>> outerTrees(vector<vector<int>>& trees) {
  64.         vector<PT>v;
  65.         for(auto it : trees){
  66.             v.push_back(PT(it[0], it[1]));
  67.         }
  68.         auto ans = GrahamScan(v);
  69.         vector<vector<int>>res;
  70.         for(auto it : ans){
  71.             vector<int>tt = {it.x, it.y};
  72.             res.push_back(tt);
  73.         }
  74.         return res;
  75.     }
  76. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement