Advertisement
Guest User

Monotone_Chain

a guest
Apr 12th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <sstream>
  5.  
  6. using namespace std;
  7.  
  8. struct Point
  9. {
  10.       int x,y;
  11.       friend std::ostream &operator << (std::ostream &output,const Point &p);
  12.       friend std::istream &operator >> (std::istream &input,Point &p);
  13. };
  14.  
  15. bool operator == (Point a,Point b)
  16. {
  17.      return (a.x == b.x && a.y == b.y);
  18. }
  19.  
  20. std::ostream &operator << (std::ostream &output,const Point &p)
  21. {
  22.         output<<"( "<<p.x<<" , "<<p.y<<" ) ";
  23.         return output;
  24. }
  25.  
  26.  
  27.  
  28. std::istream &operator >> (std::istream &input,Point &p)
  29. {
  30.         input>>p.x>>p.y;;
  31.         return input;
  32. }
  33.  
  34.  
  35. template<class T>
  36. class Link
  37. {
  38.       private:
  39.               T data;
  40.               Link<T> *next;
  41.               Link<T> *previous;
  42.       public:
  43.              Link(T data);
  44.              void displayLink();
  45.              T getData();
  46.              void setData(T data);
  47.              Link<T> *getNext();
  48.              void setNext(Link<T> *next);
  49.              Link<T> *getPrevious();
  50.              void setPrevious(Link<T> *previous);
  51.              template<class U> friend std::ostream& operator<< (std::ostream& print, Link<U>& obj);
  52.  
  53. };
  54.  
  55. template<class T>
  56. Link<T>::Link(T data)
  57. {
  58.      setData(data);
  59.      setNext(NULL);
  60.      setPrevious(NULL);
  61.                
  62. }
  63.  
  64. template<class T>
  65. void Link<T>::displayLink()
  66. {
  67.      std::cout<<getData()<<" ";
  68. }
  69.  
  70. template<class T>
  71. T Link<T>::getData()
  72. {
  73.      return data;              
  74. }
  75.  
  76. template<class T>
  77. void Link<T>::setData(T data)
  78. {
  79.      this->data = data;              
  80. }
  81.  
  82. template<class T>
  83. Link<T> *Link<T>::getNext()
  84. {
  85.       return next;  
  86. }
  87.  
  88. template<class T>
  89. void Link<T>::setNext(Link<T> *next)
  90. {
  91.       this->next = next;
  92. }
  93.  
  94. template<class T>
  95. Link<T> *Link<T>::getPrevious()
  96. {
  97.       return previous;  
  98. }
  99.  
  100. template<class T>
  101. void Link<T>::setPrevious(Link<T> *previous)
  102. {
  103.       this->previous = previous;
  104. }
  105.  
  106.  
  107. template <class U>  
  108. std::ostream& operator<<(std::ostream& print, Link<U> & L)
  109. {
  110.         print << L.getData();
  111.         return print;
  112. }
  113.  
  114. template<class T>
  115. class DoublyLinkedList
  116. {
  117.       private:
  118.               Link<T> *first;
  119.               Link<T> *last;
  120.               void enqueue(Link<T> *x);
  121.               Link<T> *dequeue();
  122.       public:
  123.              DoublyLinkedList();
  124.              ~DoublyLinkedList();
  125.              Link<T> *getFirst();
  126.              void setFirst(Link<T> *first);
  127.              Link<T> *getLast();
  128.              void setLast(Link<T> *first);
  129.              bool isEmpty();
  130.              Link<T> *find(T key);
  131.              void insertFirst(T dd);
  132.              void insertLast(T dd);
  133.              void deleteFirst();
  134.              void deleteLast();
  135.              bool insertAfter(T key,T dd);
  136.              void deleteKey(T key);
  137.              void displayForward();
  138.              void displayBackward();
  139.              void concat(DoublyLinkedList<T> &L);
  140.              void quickSort(int (*Compare)(T,T));
  141. };
  142.  
  143. template<class T>
  144. DoublyLinkedList<T>::DoublyLinkedList()
  145. {
  146.     setFirst(NULL);
  147.     setLast(NULL);                                  
  148. }
  149.  
  150. template<class T>
  151. DoublyLinkedList<T>::~DoublyLinkedList()
  152. {
  153.     while(!isEmpty())
  154.     {
  155.         deleteFirst();            
  156.     }                                  
  157. }
  158.  
  159. template<class T>
  160. Link<T> *DoublyLinkedList<T>::getFirst()
  161. {
  162.        return first;
  163. }
  164.  
  165. template<class T>
  166. void DoublyLinkedList<T>::setFirst(Link<T> *first)
  167. {
  168.      this->first = first;
  169. }
  170.  
  171. template<class T>
  172. Link<T> *DoublyLinkedList<T>::getLast()
  173. {
  174.        return last;
  175. }
  176.  
  177. template<class T>
  178. void DoublyLinkedList<T>::setLast(Link<T> *last)
  179. {
  180.      this->last = last;
  181. }
  182.  
  183. template<class T>
  184. bool DoublyLinkedList<T>::isEmpty()
  185. {
  186.      return getFirst()==NULL;
  187. }
  188.  
  189. template<class T>
  190.  Link<T> *DoublyLinkedList<T>::find(T key)
  191.  {
  192.          Link<T> *current = getFirst();
  193.          while(current != NULL && !(current->getData == key))
  194.                current = current->getNext();
  195.          return current;        
  196.  }
  197.  
  198.  template<class T>
  199.  void DoublyLinkedList<T>::insertFirst(T dd)
  200.  {
  201.       Link<T> *newLink = new Link<T>(dd);
  202.       if(isEmpty())
  203.            setLast(newLink);
  204.       else
  205.           getFirst()->setPrevious(newLink);
  206.       newLink->setNext(getFirst());
  207.       setFirst(newLink);        
  208.  }
  209.  
  210.  template<class T>
  211.  void DoublyLinkedList<T>::insertLast(T dd)
  212.  {
  213.       Link<T> *newLink = new Link<T>(dd);
  214.       if(isEmpty())
  215.       {
  216.           setFirst(newLink);        
  217.       }
  218.       else
  219.       {
  220.           getLast()->setNext(newLink);
  221.           newLink->setPrevious(getLast());
  222.       }
  223.       setLast(newLink);
  224.  }
  225.  
  226.  template<class T>
  227.  void DoublyLinkedList<T>::deleteFirst()
  228.  {
  229.       if(isEmpty())
  230.            return;
  231.       Link<T> *temp = getFirst();
  232.       if(getFirst()->getNext() == NULL)
  233.             setLast(NULL);
  234.       else
  235.          getFirst()->getNext()->setPrevious(NULL);
  236.       setFirst(getFirst()->getNext());
  237.       delete temp;                            
  238.  }
  239.  
  240.  template<class T>
  241.  void DoublyLinkedList<T>::deleteLast()
  242.  {
  243.       if(isEmpty())
  244.          return;
  245.       Link<T> *temp = getLast();
  246.       if(getFirst()->getNext() == NULL)
  247.              setFirst(NULL);
  248.       else
  249.           getLast()->getPrevious()->setNext(NULL);
  250.       setLast(getLast()->getPrevious());
  251.       delete temp;                  
  252.  }
  253.  
  254.  template<class T>
  255.  bool DoublyLinkedList<T>::insertAfter(T key,T dd)
  256.  {
  257.       Link<T> *current = find(key);
  258.       if(current == NULL)
  259.              return false;
  260.       Link<T> *newLink = new Link<T>(dd);
  261.       if(current->getNext() == NULL)
  262.       {
  263.            newLink->setNext(NULL);
  264.            setLast(newLink);                
  265.       }
  266.       else
  267.       {
  268.           newLink->setNext(current->getNext());
  269.           current->getNext()->setPrevious(newLink);
  270.       }
  271.       newLink->setPrevious(current);
  272.       current->setNext(newLink);
  273.       return true;    
  274.  }
  275.  
  276.  template<class T>
  277.  void DoublyLinkedList<T>::deleteKey(T key)
  278.  {
  279.       Link<T> *current = find(key);
  280.       if(current==NULL)
  281.            return;
  282.       if(current->getPrevious() == NULL)
  283.              setFirst(current->getNext());
  284.       else
  285.              current->getPrevious()->setNext(current->getNext());
  286.       if(current->getNext() == NULL)
  287.              setLast(current->getPrevious());
  288.       else
  289.              current->getNext()->setPrevious(current->getPrevious());
  290.       delete current;
  291.  }
  292.  
  293.  template<class T>
  294.  void DoublyLinkedList<T>::displayForward()
  295.  {
  296.       std::cout<<"List (first-->last): ";
  297.       Link<T> *current = getFirst();
  298.       while(current != NULL)
  299.       {
  300.          current->displayLink();
  301.          current = current->getNext();  
  302.       }
  303.       std::cout<<"\n";
  304.  }
  305.  
  306.  template<class T>
  307.  void DoublyLinkedList<T>::displayBackward()
  308.  {
  309.       std::cout<<"List (last-->first): ";
  310.       Link<T> *current = getLast();
  311.       while(current != NULL)
  312.       {
  313.          current->displayLink();
  314.          current = current->getPrevious();  
  315.       }
  316.       std::cout<<"\n";
  317.  }
  318.  
  319. template<class T>
  320. void DoublyLinkedList<T>::concat(DoublyLinkedList<T> &L)
  321. {
  322.      Link<T> *head;
  323.      Link<T> *tail;
  324.      if(!isEmpty() && !L.isEmpty())
  325.      {
  326.           tail = getLast();
  327.           head = L.getFirst();
  328.           tail->setNext(head);
  329.           head->setPrevious(tail);
  330.           setLast(L.getLast());
  331.           L.setFirst(NULL);
  332.           L.setLast(NULL);        
  333.      }
  334.      else if(isEmpty())
  335.      {
  336.           setFirst(L.getFirst());
  337.           setLast(L.getLast());
  338.           L.setFirst(NULL);
  339.           L.setLast(NULL);
  340.      }
  341. }
  342.  
  343. template<class T>
  344. void DoublyLinkedList<T>::enqueue(Link<T> *x)
  345. {
  346.      x->setNext(NULL);
  347.      if(isEmpty())
  348.        setFirst(x);
  349.      else
  350.          getLast()->setNext(x);
  351.      x->setPrevious(getLast());
  352.      setLast(x);          
  353. }
  354.  
  355. template<class T>
  356. Link<T> *DoublyLinkedList<T>::dequeue()
  357. {
  358.         if(isEmpty())
  359.            return NULL;
  360.         Link<T> *temp = getFirst();
  361.         if(getFirst()->getNext() == NULL)
  362.            setLast(NULL);
  363.         else
  364.             getFirst()->getNext()->setPrevious(NULL);
  365.         setFirst(getFirst()->getNext());
  366.         return temp;                                
  367. }
  368.  
  369. template<class T>
  370. void DoublyLinkedList<T>::quickSort(int (*Compare)(T,T))
  371. {
  372.      DoublyLinkedList<T> L,E,G;
  373.      Link<T> *pivot;
  374.      Link<T> *temp;
  375.      if(getFirst() != getLast())
  376.      {
  377.          L.setFirst(NULL);L.setLast(NULL);
  378.          E.setFirst(NULL);E.setLast(NULL);
  379.          G.setFirst(NULL);G.setLast(NULL);
  380.          pivot = getLast();
  381.          while(!isEmpty())
  382.          {
  383.              temp = dequeue();
  384.              if(Compare(temp->getData(),pivot->getData()) < 0)
  385.                 L.enqueue(temp);
  386.              else if(Compare(temp->getData(),pivot->getData()) == 0)
  387.                 E.enqueue(temp);
  388.              else
  389.                 G.enqueue(temp);                                    
  390.          }
  391.          
  392.          L.quickSort(Compare);
  393.          G.quickSort(Compare);
  394.          
  395.          concat(L);
  396.          concat(E);
  397.          concat(G);          
  398.      }
  399. }
  400.  
  401. int Compare(Point a,Point b)
  402. {
  403.     int t = 1;
  404.     if(a.x < b.x || a.x == b.x && a.y < b.y)
  405.         t = -1;
  406.     if(a.x == b.x && a.y == b.y)
  407.            t = 0;
  408.     return t;  
  409. }
  410.  
  411. int ccw(Point a,Point b,Point c)
  412. {
  413.     return (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.y);
  414. }
  415.  
  416. void Solve(DoublyLinkedList<Point> &A,DoublyLinkedList<Point> &B)
  417. {
  418.      int k,t;
  419.      Link<Point> *pt;
  420.      B.setFirst(NULL);
  421.      B.setLast(NULL);
  422.      if(!A.isEmpty())
  423.      {
  424.         A.quickSort(Compare);
  425.         pt = A.getFirst();
  426.         k = 0;
  427.         while(pt != NULL)
  428.         {
  429.             while(k >= 2 && ccw(B.getLast()->getPrevious()->getData(),B.getLast()->getData(),pt->getData()) <= 0)
  430.             {
  431.                 B.deleteLast();
  432.                 k--;    
  433.             }    
  434.             B.insertLast(pt->getData());
  435.             k++;
  436.             pt = pt->getNext();    
  437.         }
  438.         t = k + 1;
  439.         pt = A.getLast();
  440.         while(pt != NULL)
  441.         {
  442.             while(k >= t && ccw(B.getLast()->getPrevious()->getData(),B.getLast()->getData(),pt->getData()) <= 0)
  443.             {
  444.                 B.deleteLast();
  445.                 k--;    
  446.             }    
  447.             B.insertLast(pt->getData());
  448.             k++;
  449.             pt = pt->getPrevious();    
  450.         }
  451.         B.deleteLast();            
  452.      }
  453. }
  454.  
  455. int main(int argc, char *argv[])
  456. {
  457.     DoublyLinkedList<Point> A;
  458.     DoublyLinkedList<Point> B;
  459.     stringstream ss;
  460.     Point p;
  461.     string line;
  462.     int counter;
  463.     while(getline(cin,line))
  464.     {
  465.        ss.clear();
  466.        ss.str(line);
  467.        counter = 1;
  468.        while(ss)
  469.        {
  470.            try
  471.            {
  472.                switch(counter)
  473.                {
  474.                    case 1:
  475.                    {
  476.                        ss>>p.x;
  477.                        break;
  478.                    }
  479.                    case 0:
  480.                    {
  481.                        ss>>p.y;
  482.                        A.insertLast(p);
  483.                        break;
  484.                    }
  485.                }
  486.            }
  487.            catch(...)
  488.            {
  489.                
  490.            }
  491.            counter = (counter + 1)%2;
  492.        }
  493.         Solve(A,B);
  494.         cout<<"List A \n";
  495.         A.displayForward();
  496.         A.displayBackward();
  497.         cout<<"List B \n";
  498.         B.displayForward();
  499.         B.displayBackward();
  500.         while(!A.isEmpty())
  501.             A.deleteFirst();
  502.         while(!B.isEmpty())
  503.             B.deleteFirst();
  504.     }    
  505.     return EXIT_SUCCESS;
  506. }
  507.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement