vadimk772336

last

Nov 1st, 2021
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.79 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 l, int r, int status, list_segments* segment, int heap_ID);
  177. void delete_segment(list_segments* segment);
  178. void add_head(int l, int r, int status, int heap_ID);
  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, 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. int answer = heap_top->l;
  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. {
  290. List->add_head(l, r, status, heap_ID);
  291. requests[i] = List->get_top();
  292. }
  293. }
  294.  
  295. heap->siftdown(0);
  296. answers.push_back(answer);
  297. }
  298. else
  299. {
  300. requests[i] = nullptr;
  301. answers.push_back(-1);
  302. }
  303. }
  304.  
  305. void free_up_memory(
  306. Heap* heap, List* List, int q, int i, std::vector<int>& answers, list_segments** requests)
  307. {
  308.  
  309. if (requests[q] != nullptr)
  310. {
  311. requests[q]->status = 1;
  312.  
  313. if (requests[q]->prev != nullptr)
  314. {
  315. if (requests[q]->prev->status == 1 & requests[q]->prev->r == requests[q]->l - 1)
  316. {
  317. requests[q]->l = requests[q]->prev->l;
  318. heap->delete_vertex(requests[q]->prev->heap_ID);
  319. List->delete_segment(requests[q]->prev);
  320. }
  321. }
  322.  
  323. if (requests[q]->next != nullptr)
  324. {
  325. if (requests[q]->next->status == 1 & requests[q]->next->l - 1 == requests[q]->r)
  326. {
  327. requests[q]->r = requests[q]->next->r;
  328. heap->delete_vertex(requests[q]->next->heap_ID);
  329. List->delete_segment(requests[q]->next);
  330. }
  331. }
  332.  
  333. heap->add(requests[q]->l, requests[q]->r, requests[q]);
  334. }
  335. requests[q] = nullptr;
  336. requests[i] = nullptr;
  337. }
  338.  
  339. int main()
  340. {
  341.  
  342. int N, M, K;
  343.  
  344. Heap heap;
  345. List list;
  346. list_segments* requests[M];
  347.  
  348. heap_elements* heap_top;
  349. std::vector<int> answers;
  350. list.add_head(1, N, 1, 0);
  351. heap.add(1, N, list.get_top());
  352.  
  353. for (int i = 0; i < M; ++i)
  354. {
  355. cin >> K;
  356.  
  357. if (K > 0)
  358. find_memory(&heap, &list, K, i, answers, requests);
  359.  
  360. else
  361. free_up_memory(&heap, &list, -K - 1, i, answers, requests);
  362. }
  363.  
  364. return 0;
  365. }
  366.  
Advertisement
Add Comment
Please, Sign In to add comment