vadimk772336

c файлом улучшенный

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