vadimk772336

починить мэйн

Nov 1st, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4.  
  5. using namespace std;
  6.  
  7. enum heap_type
  8. {
  9. heap_max = 0,
  10. heap_min = 1
  11. };
  12.  
  13. class Heap
  14. {
  15. std::vector<int> h;
  16. std::vector<int> ID_to_HeapIdx;
  17. int heap_size;
  18. int curr_ID;
  19.  
  20. public:
  21. Heap();
  22. void siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  23. void siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  24. void add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID);
  25. void delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  26. bool isempty();
  27. void out();
  28. int get_root();
  29. };
  30.  
  31. Heap::Heap()
  32. {
  33. std::vector<int> h;
  34. heap_size = 0;
  35. std::vector<int> ID_to_HeapIdx;
  36. }
  37.  
  38. int Heap::get_root()
  39. {
  40. if (heap_size > 0)
  41. return h[0];
  42. return -1;
  43. }
  44.  
  45. bool Heap::isempty()
  46. {
  47. if (heap_size == 0)
  48. return true;
  49. return false;
  50. }
  51.  
  52. void Heap::siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  53. {
  54. int curr, parent, tmp;
  55. curr = heap_size - 1;
  56. parent = (curr - 1);
  57. for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  58. for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  59. while (parent >= 0 && curr > 0)
  60. {
  61.  
  62. if (sort_type == heap_max & h[parent] < h[curr])
  63. {
  64.  
  65. int buff = h[curr];
  66. h[curr] = h[parent];
  67. h[parent] = buff;
  68.  
  69. tmp = HeapIdx_to_ID[parent];
  70. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  71. HeapIdx_to_ID[curr] = tmp;
  72.  
  73.  
  74. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  75. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  76. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  77. }
  78.  
  79. if (sort_type == heap_min & h[parent] > h[curr])
  80. {
  81.  
  82. int buff = h[curr];
  83. h[curr] = h[parent];
  84. h[parent] = buff;
  85.  
  86. tmp = HeapIdx_to_ID[parent];
  87. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  88. HeapIdx_to_ID[curr] = tmp;
  89.  
  90.  
  91. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  92. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  93. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  94. }
  95. curr = parent;
  96. parent = (curr - 1);
  97. }
  98. }
  99.  
  100. void Heap::add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID)
  101. {
  102.  
  103. h.push_back(vertex);
  104. ID_to_HeapIdx.push_back(heap_size);
  105. HeapIdx_to_ID.push_back(ID);
  106. heap_size++;
  107. siftup(sort_type, ID, HeapIdx_to_ID);
  108. }
  109.  
  110. void Heap::siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  111. {
  112. int parent, max_child, min_child, tmp, buff;
  113.  
  114. int curr = ID_to_HeapIdx[ID];
  115. ID_to_HeapIdx[ID] = -100;
  116. int child_l = 2 * curr + 1;
  117. int child_r = 2 * curr + 2;
  118.  
  119.  
  120. if (h[child_r] < h[child_l])
  121. {
  122. max_child = child_l;
  123. min_child = child_r;
  124. }
  125. else
  126. {
  127. max_child = child_r;
  128. min_child = child_l;
  129. }
  130. while (child_l < heap_size)
  131. {
  132.  
  133.  
  134. if (sort_type == heap_max)
  135. {
  136. if (child_l == heap_size - 1)
  137. max_child = child_l;
  138.  
  139. else if (h[child_r] < h[child_l])
  140. max_child = child_l;
  141. else
  142. max_child = child_r;
  143. }
  144.  
  145. if (sort_type == heap_min)
  146. {
  147. if (child_l == heap_size - 1)
  148. min_child = child_l;
  149. else if (h[child_r] < h[child_l])
  150. min_child = child_r;
  151. else
  152. min_child = child_l;
  153. }
  154.  
  155. if (sort_type == heap_max & h[curr] < h[max_child])
  156. {
  157.  
  158. buff = h[curr];
  159. h[curr] = h[max_child];
  160. h[max_child] = buff;
  161.  
  162. tmp = HeapIdx_to_ID[max_child];
  163. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  164. HeapIdx_to_ID[curr] = tmp;
  165.  
  166. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  167. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  168. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  169. }
  170.  
  171. if (sort_type == heap_min & h[curr] > h[max_child])
  172. {
  173.  
  174. buff = h[curr];
  175. h[curr] = h[max_child];
  176. h[max_child] = buff;
  177.  
  178. tmp = HeapIdx_to_ID[max_child];
  179. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  180. HeapIdx_to_ID[curr] = tmp;
  181.  
  182. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  183. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  184. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  185. }
  186. curr = max_child;
  187. child_l = 2 * curr + 1;
  188. child_r = 2 * curr + 2;
  189. }
  190. }
  191.  
  192.  
  193. void Heap::delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  194. {
  195.  
  196. cout << "До каких либо действий" << endl;
  197. if (sort_type == heap_max)
  198. cout << "ID_to_Heap1Idx[ID]= " ;
  199. else
  200. cout << "ID_to_Heap2Idx[ID]= " ;
  201. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  202. cout << ID_to_HeapIdx[j] << " ";
  203. cout << endl;
  204. cout << endl;
  205.  
  206. if (sort_type == heap_max)
  207. cout << "HeapIdx1_to_ID[ID]= " ;
  208. else
  209. cout << "HeapIdx2_to_ID[ID]= " ;
  210. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  211. cout << HeapIdx_to_ID[j] << " ";
  212. cout << endl;
  213. cout << endl;
  214.  
  215. int pos = ID_to_HeapIdx[ID];
  216. h[pos] = h[heap_size - 1];
  217.  
  218. cout << "поступил запрос на удаление по ID= " << ID << "pos in heap = " << pos << endl;
  219. cout << "h[pos]" << h[pos] << endl;
  220.  
  221. h.pop_back();
  222. heap_size--;
  223. int id_last_el = HeapIdx_to_ID[heap_size];
  224. HeapIdx_to_ID[pos] = id_last_el;
  225. HeapIdx_to_ID[heap_size] = -100;
  226. ID_to_HeapIdx[id_last_el] = pos; //Дают айди послед эл, а он уже на Pos
  227. siftdown(sort_type, ID, HeapIdx_to_ID);
  228. }
  229.  
  230. void Heap::out(void)
  231. {
  232.  
  233. for (int i = 0; i < heap_size; i++)
  234. {
  235. cout << h[i] << " ";
  236. }
  237. cout << endl;
  238. }
  239.  
  240.  
  241.  
  242.  
  243. int main()
  244. {
  245. Heap heap1;
  246. Heap heap2;
  247. std::vector<int> HeapIdx1_to_ID;
  248. std::vector<int> HeapIdx2_to_ID;
  249. char c;
  250.  
  251. int count = 1;
  252. int ID1 = -1;
  253. int ID2 = -1;
  254. deque<int> deq1;
  255. deque<int> deq2;
  256.  
  257. int N, M, K, ID, root1_ID, root2_ID;
  258. N = 4;
  259. M = 6;
  260. K = 1;
  261.  
  262.  
  263. int ID1toID2[N];
  264. int ID2toID1[N];
  265.  
  266. int R = 0, L = 0;
  267. //int a[N] = { 4, 2, 1, 3, 6, 5, 7 };
  268. int a[N] = { 1,2,3,4};
  269.  
  270.  
  271. ID1++;
  272. heap1.add(heap_max, a[0], ID1, HeapIdx1_to_ID);
  273. deq1.push_back(ID1);
  274. cout << "До цикла heap1 :";
  275. heap1.out();
  276. cout << "До цикла heap2 :";
  277. heap2.out();
  278. for (int i = 1; i < M; ++i)
  279. {
  280. cin >> c;
  281. if (c == 'R')
  282. {
  283. count++;
  284. R++;
  285. cout << "----------------" << endl;
  286. cout << "R; R = " << R << " count =" << count << endl;
  287. if (count < K)
  288. {
  289. cout << "count < K, просто добавляю в кучу" << endl;
  290. ID1++;
  291. heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  292. deq1.push_back(ID1);
  293. cout << "heap1 :";
  294. heap1.out();
  295. cout << "heap2 :";
  296. heap2.out();
  297. cout << "deq1: ";
  298. for (int j=0; j < deq1.size(); ++j) {
  299. cout << deq1[j] << " ";
  300. }
  301. cout << "answer: " << "-1" << endl;
  302. }
  303. if (count == K)
  304. {
  305. cout << "count == K, просто добавляю в кучу" << endl;
  306. ID1++;
  307. heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  308. deq1.push_back(ID1);
  309. cout << "deq1: ";
  310. for (int j=0; j < deq1.size(); ++j) {
  311. cout << deq1[j] << " ";
  312. }
  313. cout << "answer: " << heap1.get_root() << endl;
  314. cout << "heap1 :";
  315. heap1.out();
  316. cout << "heap2 :";
  317. heap2.out();
  318. }
  319. if (count > K)
  320. {
  321. cout << "count > K, Появились лишние - их во вторую кучу (если больше корня, иначе в 1 а корень во вторую)" << endl;
  322.  
  323. if (a[R] > heap1.get_root())
  324. {
  325. cout << "a[R] больше корня - во вторую кучу просто" << endl;
  326.  
  327. ID2++;
  328. heap2.add(heap_min, a[R], ID2, HeapIdx2_to_ID);
  329. deq2.push_back(ID2);
  330. cout << "answer: " << heap1.get_root() << endl;
  331. cout << "heap1 :";
  332. heap1.out();
  333. cout << "heap2 :";
  334. heap2.out();
  335. }
  336.  
  337. else
  338.  
  339. {
  340.  
  341. cout << "a[R] < корня, корень стал уже к+1 и его во вторую надо " << endl;
  342.  
  343. cout << endl;
  344. root1_ID = HeapIdx1_to_ID[0];
  345. int root1 = heap1.get_root(); //Запоминаю вершину до удаления
  346. heap1.delete_vertex(heap_max, root1_ID, HeapIdx1_to_ID);
  347.  
  348. cout << "do0 deq1: ";
  349. for (int j=0; j < deq1.size(); ++j) {
  350. cout << deq1[j] << " ";
  351. }
  352. ID1++;
  353. heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  354. deq1.push_back(ID1);
  355.  
  356. ID2++;
  357. heap2.add(heap_min, root1, ID2, HeapIdx2_to_ID);
  358. deq2.push_back(ID2);
  359. cout << "do deq1: ";
  360. for (int j=0; j < deq1.size(); ++j) {
  361. cout << deq1[j] << " ";
  362. }
  363. cout << endl;
  364. deq1[root1_ID] = -ID2-1; //!!!!! Означает что лежит во второй куче на ID2
  365. cout << "posle deq1: ";
  366. for (int j=0; j < deq1.size(); ++j) {
  367. cout << deq1[j] << " ";
  368. }
  369. cout << endl;
  370. ID1toID2[root1_ID] = ID2;
  371. ID2toID1[ID2] = root1_ID;
  372. cout << "answer: " << heap1.get_root() << endl;
  373. cout << "heap1 :";
  374. heap1.out();
  375. cout << "heap2 :";
  376. heap2.out();
  377. }
  378. }
  379. }
  380. else
  381. {
  382. L++;
  383. count--;
  384. cout << "----------------" << endl;
  385. cout << "L,count = " << L << " " << count << endl;
  386. if (count < K)
  387. {
  388. cout << "count < K /Стало недостаточно, удаляем первый добавленный в 1 кучу " << endl;
  389. ID = deq1[0];
  390. if (ID < 0)
  391. {
  392. cout << "Значит элемент лежит во 2 куче и там его надо искать" << endl;
  393. deq1.pop_front();
  394.  
  395. heap2.delete_vertex(heap_min, -ID, HeapIdx2_to_ID);
  396. cout << "answer: " << "-1" << endl;
  397. cout << "heap1 :";
  398. heap1.out();
  399. cout << "heap2 :";
  400. heap2.out();
  401. }
  402. else
  403. {
  404. cout << "Значит элемент лежит в 1 куче и там его надо искать" << endl;
  405. deq1.pop_front();
  406. heap1.delete_vertex(heap_max, ID, HeapIdx1_to_ID);
  407. cout << "answer: " << "-1" << endl;
  408. cout << "heap1 :";
  409. heap1.out();
  410. cout << "heap2 :";
  411. heap2.out();
  412. }
  413. }
  414. if (count >= K)
  415. {
  416. cout << "count >= K; В 1 куче к-1, во 2 не пусто. Надо удалить первый в 1 куче, перебросить из 2 кучи , удалить его и вывести " << endl;
  417. cout << "deq1: ";
  418. for (int j=0; j < deq1.size(); ++j) {
  419. cout << deq1[j] << " ";
  420. }
  421. cout << endl;
  422.  
  423. ID = deq1[0];
  424. cout << "ID= " << ID << endl;
  425.  
  426. if (ID < 0)
  427. {
  428.  
  429. //ID = ID1toID2;
  430. cout << "Тот, кого нужно удалить находится во 2 куче, удаляем его" << endl;
  431. cout << "TrueID= " << -ID-1 << endl;
  432. deq1.pop_front();
  433.  
  434. heap2.delete_vertex(heap_min, -ID-1, HeapIdx2_to_ID);
  435. cout << "heap1 :";
  436. heap1.out();
  437. cout << "heap2 :";
  438. heap2.out();
  439.  
  440. cout << "Так как удаляли из 2 кучи, первая не пострадала ничего не делаем" << endl;
  441. cout << "answer: " << heap1.get_root() << endl;
  442. }
  443. else
  444. {
  445. cout << "Тот, кого нужно удалить находится в 1 куче, удаляем его" << endl;
  446. deq1.pop_front();
  447. heap1.delete_vertex(heap_max, ID, HeapIdx1_to_ID);
  448. cout << "heap1 :";
  449. heap1.out();
  450. cout << "heap2 :";
  451. heap2.out();
  452. cout << "Так как удаляли из 1 кучи, надо перебросить" << endl;
  453.  
  454. ID1++;
  455. heap1.add(heap_max, heap2.get_root(), ID1, HeapIdx1_to_ID);
  456.  
  457.  
  458. int ID_top2 = HeapIdx2_to_ID[0];
  459. heap2.delete_vertex(heap_min, ID_top2, HeapIdx2_to_ID);
  460. cout << "do deq1: ";
  461. for (int j=0; j < deq1.size(); ++j) {
  462. cout << deq1[j] << " ";
  463. }
  464. cout << endl;
  465. deq1[ID2toID1[ID_top2]] = ID2toID1[ID_top2];
  466. cout << "posle deq1: ";
  467. for (int j=0; j < deq1.size(); ++j) {
  468. cout << deq1[j] << " ";
  469. }
  470. cout << endl;
  471. cout << "answer: " << heap1.get_root() << endl;
  472. cout << "heap1 :";
  473. heap1.out();
  474. cout << "heap2 :";
  475. heap2.out();
  476. }
  477. }
  478. }
  479. }
  480.  
  481. return 0;
  482. }
  483.  
  484.  
Advertisement
Add Comment
Please, Sign In to add comment