vadimk772336

ломается

Nov 2nd, 2021
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.68 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. to_list->heap_ID = current_ID;
  141.  
  142. h.push_back(vertex);
  143. ID_to_Index.push_back(heap_size);
  144. heap_size++;
  145. current_ID++;
  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 = NULL;
  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 != NULL)
  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 != NULL)
  218. segment->next->prev = after_segment;
  219.  
  220. count++;
  221. }
  222.  
  223. void List::delete_segment(list_segments* segment)
  224. {
  225. if (segment->next != NULL)
  226. segment->next->prev = segment->prev;
  227.  
  228. if (segment->prev != NULL)
  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 != NULL)
  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 + 1) >= K)
  263. {
  264. if ((heap_top->r - heap_top->l + 1) == K)
  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 != NULL)
  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. }
  299. else
  300. {
  301. requests[i] = NULL;
  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. if (requests[q] != NULL)
  310. {
  311. requests[q]->status = 1;
  312. if (requests[q]->prev != NULL)
  313. {
  314. if (requests[q]->prev->status == 1 & requests[q]->prev->r == requests[q]->l - 1)
  315. {
  316. requests[q]->l = requests[q]->prev->l;
  317. heap->delete_vertex(requests[q]->prev->heap_ID);
  318. List->delete_segment(requests[q]->prev);
  319. }
  320. }
  321.  
  322. if (requests[q]->next != NULL)
  323. {
  324. if (requests[q]->next->status == 1 & requests[q]->next->l - 1 == requests[q]->r)
  325. {
  326. requests[q]->r = requests[q]->next->r;
  327. heap->delete_vertex(requests[q]->next->heap_ID);
  328. List->delete_segment(requests[q]->next);
  329. }
  330. }
  331.  
  332. heap->add(requests[q]->l, requests[q]->r, requests[q]);
  333.  
  334. }
  335. requests[i] = NULL;
  336. }
  337.  
  338. int main()
  339. {
  340.  
  341. int count_tests;
  342. ifstream ifs("tests.txt");
  343. ifs >> count_tests;
  344. ofstream out("results.txt");
  345.  
  346.  
  347. int N, M, K;
  348.  
  349. for (int i = 0; i < count_tests; ++i)
  350. {
  351. ifs >> N; ifs >> M;
  352.  
  353. Heap heap;
  354. List list;
  355. list_segments* requests[M];
  356.  
  357. heap_elements* heap_top;
  358. std::vector<int> answers;
  359. list.add_head(1, N, 1, 0);
  360. heap.add(1, N, list.get_top());
  361.  
  362. cout << "------------------\n";
  363. cout << "heap: :";
  364. heap.out();
  365. cout << "list: :";
  366. list.Print();
  367.  
  368. for (int i = 0; i < M; ++i)
  369. {
  370. ifs >> K;
  371.  
  372. if (K > 0)
  373. find_memory(&heap, &list, K, i, answers, requests);
  374.  
  375. else
  376. free_up_memory(&heap, &list, -K - 1, i, answers, requests);
  377.  
  378. cout << "------------------\n";
  379. cout << "heap: :";
  380. heap.out();
  381. cout << "list: :";
  382. list.Print();
  383. for (int k=0; k<i+1;k++)
  384. cout << "(" << requests[k]->l << ";" << requests[k]->status << ";" << requests[k]->r << ")";
  385. cout << endl;
  386. }
  387.  
  388. for (int i = 0; i < answers.size(); ++i)
  389. out << answers[i] << ' ';
  390. out << '\n';
  391. }
  392. return 0;
  393. }
  394.  
Advertisement
Add Comment
Please, Sign In to add comment