Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. struct stempel
  7. {
  8.     string name;
  9.     int number;
  10. };
  11.  
  12. struct xy
  13. {
  14.     int x;
  15.     int y;
  16. };
  17.  
  18. class List
  19. {
  20.     class part
  21.     {
  22.     public:
  23.         stempel value;
  24.         part *next;
  25.         part *previus;
  26.     };
  27. public:
  28.     part *head;
  29.     part *tail;
  30.     part *pos;
  31.     int counter = 0;
  32.  
  33.     List();
  34.     void push_back(stempel);
  35.     void search(int);
  36.     void erase();
  37. };
  38.  
  39. List::List()
  40. {
  41.     head = nullptr;
  42.     tail = nullptr;
  43.     pos = nullptr;
  44. }
  45.  
  46. void List::push_back(stempel s)
  47. {
  48.     part *frag = new part;
  49.     frag->next = nullptr;
  50.     frag->previus = nullptr;
  51.     frag->value = s;
  52.  
  53.     if (head == nullptr)
  54.     {
  55.         frag->next = frag;
  56.         frag->previus = frag;
  57.         head = frag;
  58.         tail = frag;
  59.         pos = head;
  60.         counter++;
  61.     }
  62.     else
  63.     {
  64.         frag->next = head;
  65.         head->previus = frag;
  66.         frag->previus = tail;
  67.         tail->next = frag;
  68.         tail = frag;
  69.         counter++;
  70.     }
  71. }
  72.  
  73. void List::search(int y)
  74. {
  75.     if (pos == nullptr) pos = head;
  76.     if (y == 0) return;
  77.  
  78.     if (y > 0)
  79.     {
  80.         y = y%counter;
  81.         for (int i = 1; i <= y; i++)
  82.         {
  83.             pos = pos->next;
  84.         }
  85.     }
  86.     else
  87.     {
  88.         y = y*(-1);
  89.         y = y%counter;
  90.         for (int i = 1; i <= y; i++)
  91.         {
  92.             pos = pos->previus;
  93.         }
  94.     }
  95. }
  96.  
  97. void List::erase()
  98. {
  99.     if (head == nullptr) return;
  100.  
  101.     part *temp = head;
  102.  
  103.     if (pos == head && pos == tail)
  104.     {
  105.         head = nullptr;
  106.         tail = nullptr;
  107.         pos = nullptr;
  108.         delete temp;
  109.         return;
  110.     }
  111.  
  112.     if (pos == head)
  113.     {
  114.         head = temp->next;
  115.         head->previus = temp->previus;
  116.         temp->previus->next = head;
  117.         delete temp;
  118.         pos = head;
  119.     }
  120.     else if (pos == tail)
  121.     {
  122.         temp = tail->previus;
  123.         temp->next = head;
  124.         head->previus = temp;
  125.         delete tail;
  126.         tail = temp;
  127.         pos = head;
  128.     }
  129.     else
  130.     {
  131.         part *postemp = pos->next;
  132.         temp = pos->previus;
  133.         temp->next = pos->next;
  134.         pos->next->previus = temp;
  135.         delete pos;
  136.         pos = postemp;
  137.     }
  138.     counter--;
  139. }
  140.  
  141. class List_main
  142. {
  143.     class part
  144.     {
  145.     public:
  146.         List *value;
  147.         part *next;
  148.         part *previus;
  149.     };
  150. public:
  151.     part *head;
  152.     part *tail;
  153.     part *pos;
  154.     int sum;
  155.     int counter = 0;
  156.     int oldval = 0;
  157.  
  158.     List_main();
  159.     void search(int, int);
  160.     void push_back(List*);
  161.     void count_sum();
  162.     void erase();
  163.     void show() const;
  164.     bool isempty();
  165. };
  166.  
  167. List_main::List_main()
  168. {
  169.     head = nullptr;
  170.     tail = nullptr;
  171.     pos = nullptr;
  172. }
  173.  
  174. void List_main::show() const
  175. {
  176.     part *temp = head;
  177.     while (temp->next != head)
  178.     {
  179.         cout << temp->value->pos->value.name;
  180.         temp = temp->next;
  181.     }
  182.     cout << temp->value->pos->value.name;
  183. }
  184.  
  185. void List_main::push_back(List* l)
  186. {
  187.     part *frag = new part;
  188.     frag->next = nullptr;
  189.     frag->previus = nullptr;
  190.     frag->value = l;
  191.  
  192.     if (head == nullptr)
  193.     {
  194.         frag->next = frag;
  195.         frag->previus = frag;
  196.         head = frag;
  197.         tail = frag;
  198.         pos = head;
  199.         counter++;
  200.     }
  201.     else
  202.     {
  203.         frag->next = head;
  204.         head->previus = frag;
  205.         frag->previus = tail;
  206.         tail->next = frag;
  207.         tail = frag;
  208.         counter++;
  209.     }
  210. }
  211.  
  212. void List_main::search(int x, int y)
  213. {
  214.     if (pos == nullptr) pos = head;
  215.  
  216.         if (x == 0)
  217.         {
  218.             sum -= pos->value->pos->value.number;
  219.             pos->value->search(y);
  220.             sum += pos->value->pos->value.number;
  221.             return;
  222.         }
  223.  
  224.         if (x > 0)
  225.         {
  226.             x = x%counter;
  227.             for (int i = 1; i <= x; i++)
  228.             {
  229.                 pos = pos->next;
  230.             }
  231.             sum -= pos->value->pos->value.number;
  232.         }
  233.         else
  234.         {
  235.             x = x*(-1);
  236.             x = x%counter;
  237.             for (int i = 1; i <= x; i++)
  238.             {
  239.                 pos = pos->previus;
  240.             }
  241.             sum -= pos->value->pos->value.number;
  242.         }
  243.    
  244.     pos->value->search(y);
  245.     sum += pos->value->pos->value.number;
  246. }
  247.  
  248. void List_main::count_sum()
  249. {
  250.     part *temp = head;
  251.     sum = 0;
  252.     while (temp->next != head)
  253.     {
  254.         sum += temp->value->pos->value.number;
  255.         temp = temp->next;
  256.     }
  257.     sum += temp->value->pos->value.number;
  258. }
  259.  
  260. void List_main::erase()
  261. {
  262.     if (head == nullptr) return;
  263.  
  264.     part *temp = head;
  265.     sum = 0;
  266.  
  267.     while (temp->next != head)
  268.     {
  269.         temp->value->erase();
  270.         if (temp->value->head == nullptr && counter>1)
  271.         {
  272.             part *temp2 = temp->previus;
  273.             if (temp == head && counter!=1)
  274.             {
  275.                 int s = 0;
  276.                 temp2 = head->previus;
  277.                 head = head->next;
  278.                 temp2->next = head;
  279.                 head->previus = temp2;
  280.                 counter--;
  281.             }
  282.             else
  283.             {
  284.                 part* tempnext = temp->next;
  285.                 temp2->next = tempnext;
  286.                 tempnext->previus = temp2;
  287.                 counter--;
  288.             }
  289.         }
  290.         else sum += temp->value->pos->value.number;
  291.        
  292.         temp = temp->next;
  293.     }
  294.     temp->value->erase();
  295.     if (temp->value->head == nullptr)
  296.     {
  297.         part *temp2 = temp->previus;
  298.         temp2->next = head;
  299.         head->previus = temp2;
  300.         delete temp;
  301.         counter--;
  302.     }
  303.     else
  304.     {
  305.         sum += temp->value->pos->value.number;
  306.     }
  307.     if (counter == 1) sum = this->head->value->pos->value.number;
  308. }
  309.  
  310. bool List_main::isempty()
  311. {
  312.     if (counter == 0) return true;
  313.     else return false;
  314. }
  315.  
  316. class SumList
  317. {
  318.     class part
  319.     {
  320.     public:
  321.         int value;
  322.         part *next;
  323.     };
  324. public:
  325.     part *head;
  326.     part *tail;
  327.  
  328.     SumList()
  329.     {
  330.         head = nullptr;
  331.         tail = nullptr;
  332.     }
  333.  
  334.     void push_back(int val)
  335.     {
  336.         part *frag = new part;
  337.         frag->value = val;
  338.         frag->next = nullptr;
  339.  
  340.         if (head == nullptr)
  341.         {
  342.             head = frag;
  343.             tail = frag;
  344.             return;
  345.         }
  346.         else
  347.         {
  348.             tail->next = frag;
  349.             tail = tail->next;
  350.         }
  351.     }
  352.  
  353.     bool isempty()
  354.     {
  355.         if (head == nullptr) return true;
  356.         else return false;
  357.     }
  358.  
  359.     bool searchAndRemove(int val)
  360.     {
  361.         if (head != nullptr)
  362.         {
  363.             part* temp = head;
  364.             if (head->value == val)
  365.             {
  366.                 head = head->next;
  367.                 delete temp;
  368.                 return true;
  369.             }
  370.             else
  371.             {
  372.                 while (temp->next != nullptr && temp->next->value != val)
  373.                 {
  374.                     temp = temp->next;
  375.                 }
  376.  
  377.                 if (temp->next == nullptr) return false;
  378.                 else
  379.                 {
  380.                     if (temp->next->value == val)
  381.                     {
  382.                         part* remove = temp->next;
  383.                         temp->next = temp->next->next;
  384.                         delete remove;
  385.                         return true;
  386.                     }
  387.                 }
  388.             }
  389.         }
  390.         else
  391.             return false;
  392.         return false;
  393.     }
  394. };
  395.  
  396. int main()
  397. {
  398.     ios_base::sync_with_stdio(false);
  399.  
  400.     int n;
  401.     cin >> n;
  402.  
  403.     stempel s;
  404.     List_main lm;
  405.     int m;
  406.  
  407.     for (int i = 0; i < n; i++)
  408.     {
  409.         List *li = new List;
  410.         cin >> m;
  411.         for (int j = 1; j <= m; j++)
  412.         {
  413.             cin >> s.name >> s.number;
  414.             li->push_back(s);
  415.  
  416.         }
  417.         lm.push_back(li);
  418.     }
  419.  
  420.     int l;
  421.     cin >> l;
  422.  
  423.     SumList sums;
  424.     for (int i = 0; i < l; i++)
  425.     {
  426.         int s;
  427.         cin >> s;
  428.         sums.push_back(s);
  429.     }
  430.  
  431.     int h;
  432.     cin >> h;
  433.  
  434.     xy *tabxy = new xy[h];
  435.  
  436.     for (int i = 0; i < h; i++)
  437.     {
  438.         cin >> tabxy[i].x >> tabxy[i].y;
  439.     }
  440.  
  441.     int newl = l;
  442.     bool findsum = false;
  443.     int movecounter = 0;
  444.     bool sumMoving = false;
  445.  
  446.     lm.count_sum();
  447.  
  448.     //======
  449.     while (true)
  450.     {
  451.         findsum = true;
  452.         sumMoving = true;
  453.        
  454.         if (findsum)
  455.         {
  456.             if (!lm.isempty() && sums.searchAndRemove(lm.sum))
  457.             {
  458.                 cout << lm.sum << " ";
  459.                 lm.show();
  460.                 cout << endl;
  461.                 lm.erase();
  462.                 findsum = true;
  463.             }
  464.             else findsum = false;
  465.         }
  466.         if (!findsum && !lm.isempty() && movecounter < h)
  467.         {
  468.             lm.search(tabxy[movecounter].x, tabxy[movecounter].y);
  469.             movecounter++;
  470.             if (!lm.isempty() && sums.searchAndRemove(lm.sum))
  471.             {
  472.                 cout << lm.sum << " ";
  473.                 lm.show();
  474.                 cout << endl;
  475.                 lm.erase();
  476.                 sumMoving = true;
  477.             }
  478.             else sumMoving = false;
  479.         }
  480.         else sumMoving = false;
  481.  
  482.         if (lm.isempty()) break;
  483.         if (!sumMoving && !findsum && movecounter >= h) break;
  484.         if (sums.isempty()) break;
  485.     }
  486.  
  487.     delete[] tabxy;
  488.     return 0;
  489. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement