vadimk772336

Ивану

Nov 1st, 2021 (edited)
952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. struct heap_elements;
  6.  
  7. struct list_segments
  8. {
  9.     int l;
  10.     int r;
  11.     int status;
  12.     struct list_segments* next;
  13.     struct list_segments* prev;
  14.     int heap_ID;
  15. };
  16.  
  17. struct heap_elements
  18. {
  19.     int l;
  20.     int r;
  21.     list_segments* to_list;
  22.     int own_ID;
  23. };
  24.  
  25. bool operator<(const heap_elements& a, const heap_elements& b)
  26. {
  27.  
  28.     if ((a.r - a.l) < (b.r - b.l)
  29.         return true;
  30.     if ((a.r - a.l == b.r - b.l) & (a.l > b.l))
  31.         return true;
  32.  
  33.     return false;
  34. }
  35.  
  36. class Heap
  37. {
  38.     std::vector<struct heap_elements> h;
  39.     std::vector<int> ID_to_Index;
  40.     int heap_size;
  41.     int current_ID;
  42.  
  43. public:
  44.     Heap();
  45.     bool isempty();
  46.     heap_elements* get_top();
  47.     void siftup();
  48.     void siftdown(int pos);
  49.     void swap(int i, int j);
  50.     void add(int l, int r, list_segments* to_list);
  51.     void delete_vertex(int ID);
  52.     void out();
  53. };
  54.  
  55. Heap::Heap()
  56. {
  57.     std::vector<struct heap_elements> h;
  58.     heap_size = 0;
  59.     current_ID = 0;
  60.     std::vector<int> ID_to_Index;
  61. }
  62.  
  63. heap_elements* Heap::get_top()
  64. {
  65.     return &h[0];
  66. }
  67.  
  68. bool Heap::isempty()
  69. {
  70.     if (heap_size == 0)
  71.         return true;
  72.     return false;
  73. }
  74.  
  75. void Heap::swap(int i, int j)
  76. {
  77.     heap_elements buff = h[i];
  78.     h[i] = h[j];
  79.     h[j] = buff;
  80.  
  81.     ID_to_Index[h[i].own_ID] = i;
  82.     ID_to_Index[h[j].own_ID] = j;
  83. }
  84.  
  85. void Heap::siftup()
  86. {
  87.     int curr = heap_size - 1;
  88.     int parent = (curr - 1) / 2;
  89.     while (curr > 0 & parent >= 0)
  90.     {
  91.         if (h[parent] < h[curr])
  92.             swap(parent, curr);
  93.  
  94.         curr = parent;
  95.         parent = (curr - 1) / 2;
  96.     }
  97. }
  98.  
  99. void Heap::siftdown(int pos)
  100. {
  101.  
  102.     int parent, max_child;
  103.  
  104.     int curr = pos;
  105.     int child_l = 2 * curr + 1;
  106.     int child_r = 2 * curr + 2;
  107.  
  108.     if (h[child_r] < h[child_l])
  109.         max_child = child_l;
  110.     else
  111.         max_child = child_r;
  112.  
  113.     while (child_l < heap_size)
  114.     {
  115.         if (child_l == heap_size - 1)
  116.             max_child = child_l;
  117.         else if (h[child_r] < h[child_l])
  118.             max_child = child_l;
  119.         else
  120.             max_child = child_r;
  121.  
  122.         if (h[curr] < h[max_child])
  123.             swap(curr, max_child);
  124.  
  125.         curr = max_child;
  126.         child_l = 2 * curr + 1;
  127.         child_r = 2 * curr + 2;
  128.     }
  129. }
  130.  
  131. void Heap::add(int l, int r, list_segments* to_list)
  132. {
  133.  
  134.     heap_elements vertex;
  135.     vertex.l = l;
  136.     vertex.r = r;
  137.     vertex.to_list = to_list;
  138.     vertex.own_ID = current_ID;
  139.     current_ID++;
  140.     h.push_back(vertex);
  141.  
  142.     ID_to_Index.push_back(heap_size);
  143.  
  144.     heap_size++;
  145.     siftup();
  146. }
  147.  
  148. void Heap::delete_vertex(int ID)
  149. {
  150.     int pos = ID_to_Index[ID];
  151.     swap(pos, heap_size - 1);
  152.     h.pop_back();
  153.     heap_size--;
  154.     ID_to_Index[ID] = -1;
  155.     siftdown(pos);
  156. }
  157.  
  158. void Heap::out(void)
  159. {
  160.  
  161.     for (int i = 0; i < heap_size; i++)
  162.     {
  163.         cout << "(" << h[i].l << "," << h[i].r << ") ";
  164.     }
  165.     cout << endl;
  166. }
  167.  
  168. class list
  169. {
  170.     struct list_segments* head;
  171.     int count;
  172.  
  173. public:
  174.     list();
  175.     list_segments* get_top();
  176.     void add(int, int, int, int, list_segments*);
  177.     void delete_segment(list_segments* segment);
  178.     void add_head(int, int, int, int);
  179.     void Print();
  180. };
  181.  
  182. list::list()
  183. {
  184.     head = nullptr;
  185.     count = 0;
  186. }
  187.  
  188. void list::add_head(int l, int r, int status, int heap_ID)
  189. {
  190.     list_segments* buff = new list_segments;
  191.     buff->prev = 0;
  192.     buff->l = l;
  193.     buff->r = r;
  194.     buff->status = status;
  195.     buff->next = head;
  196.     buff->heap_ID = heap_ID;
  197.  
  198.     if (head != nullptr)
  199.         head->prev = buff;
  200.  
  201.     head = buff;
  202.     count++;
  203. }
  204.  
  205. void list::add(int l, int r, int status, int heap_ID, list_segments* segment, int heap_ID)
  206. {
  207.     list_segments* after_segment = new list_segments;
  208.     after_segment->l = l;
  209.     after_segment->r = r;
  210.     after_segment->status = status;
  211.     after_segment->next = segment->next;
  212.     after_segment->prev = segment;
  213.     after_segment->heap_ID = heap_ID;
  214.     segment->next = after_segment;
  215.  
  216.     if (segment->next != nullptr)
  217.         segment->next->prev = after_segment;
  218.  
  219.     count++;
  220. }
  221.  
  222. void list::delete_segment(list_segments* segment)
  223. {
  224.     if (segment->next != nullptr)
  225.         segment->next->prev = segment->prev;
  226.  
  227.     if (segment->prev != nullptr)
  228.         segment->prev->next = segment->next;
  229.     else
  230.         head = segment->next;
  231.  
  232.     delete segment;
  233. }
  234.  
  235. list_segments* list::get_top()
  236. {
  237.     return head;
  238. }
  239.  
  240. void list::Print()
  241. {
  242.  
  243.     list_segments* buff = head;
  244.     while (buff->next != nullptr)
  245.     {
  246.         cout << "(" << buff->l << ";" << buff->status << ";" << buff->r << ")"
  247.              << ";";
  248.         buff = buff->next;
  249.     }
  250.  
  251.     cout << "(" << buff->l << ";" << buff->status << ";" << buff->r << ")"
  252.          << ";\n";
  253. }
  254.  
  255.  
  256. void find_memory(
  257.     Heap* heap, List* List, int K, int i, std::vector<int>& answers, list_segments** requests)
  258. {
  259.     heap_elements* heap_top = heap->get_top();
  260.  
  261.     if (!heap->isempty() & heap_top->r - heap_top->l > K - 2)
  262.     {
  263.  
  264.         if (heap_top->r - heap_top->l == K - 1)
  265.         {
  266.             heap_top->to_list->status = 0;
  267.             heap_top->to_list->heap_ID = -1; //Мб не нужна
  268.             requests[i] = heap_top->to_list;
  269.             answers.push_back(heap_top->l);
  270.             heap->delete_vertex(heap_top->own_ID);
  271.         }
  272.         else
  273.         {
  274.             int l = heap_top->l;
  275.             int r = l + K - 1;
  276.             int status = 0;
  277.             int heap_ID = -1;
  278.             list_segments* prev_head_segment = heap_top->to_list->prev;
  279.  
  280.             heap_top->l = l + K;
  281.             heap_top->to_list->l = l + K;
  282.  
  283.             if (heap_top->to_list->prev != nullptr)
  284.             {
  285.                 List->add(l, r, status, , prev_head_segment, heap_ID);
  286.                 requests[i] = heap_top->to_list->prev;
  287.             }
  288.             else
  289.                 List->add_head(l, r, status, heap_ID);
  290.             requests[i] = List->get_top();
  291.         }
  292.  
  293.         heap->siftdown(0);
  294.         answers.push_back(l);
  295.     }
  296.     else
  297.     {
  298.         requests[i] = nullptr;
  299.         answers.push_back(-1);
  300.     }
  301. }
  302.  
  303. void free_up_memory(
  304.     Heap* heap, List* List, int q, int i, std::vector<int>& answers, list_segments** requests)
  305. {
  306.  
  307.     if (requests[q] != nullptr)
  308.     {
  309.         requests[q]->status = 1;
  310.  
  311.         if (requests[q]->prev != nullptr)
  312.         {
  313.             if (requests[q]->prev->status == 1 & requests[q]->prev->r == requests[q]->l - 1)
  314.             {
  315.                 requests[q]->l = requests[q]->prev->l;
  316.                 heap->delete_vertex(requests[q]->prev->heap_ID);
  317.                 List->delete_segment(requests[q]->prev);
  318.             }
  319.         }
  320.  
  321.         if (requests[q]->next != nullptr)
  322.         {
  323.             if (requests[q]->next->status == 1 & requests[q]->next->l - 1 == requests[q]->r)
  324.             {
  325.                 requests[q]->r = requests[q]->next->r;
  326.                 heap->delete_vertex(requests[q]->next->heap_ID);
  327.                 List->delete_segment(requests[q]->next);
  328.             }
  329.         }
  330.  
  331.         heap->add(requests[q]->l, requests[q]->r, requests[q]);
  332.     }
  333.     requests[q] = nullptr;
  334.     requests[i] = nullptr;
  335. }
  336.  
  337. int main()
  338. {
  339.  
  340.     int N, M, K;
  341.  
  342.     Heap heap;
  343.     List list;
  344.     list_segments* requests[M];
  345.  
  346.     heap_elements* heap_top;
  347.     std::vector<int> answers;
  348.  
  349.     list.add_head(1, N, 1, 0, 0);
  350.     heap.add(1, N, list.get_top());
  351.  
  352.     for (int i = 0; i < M; ++i)
  353.     {
  354.         cin >> K;
  355.  
  356.         if (K > 0)
  357.             find_memory(&heap, &list, K, i, answers, requests);
  358.  
  359.         else
  360.             free_up_memory(&heap, &list, -K - 1, i, answers, requests);
  361.     }
  362.  
  363.     return 0;
  364. }
  365.  
Advertisement
Add Comment
Please, Sign In to add comment