vadimk772336

Принята

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