vadimk772336

Untitled

Oct 30th, 2021
1,162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <deque>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     Heap heap1;
  8.     Heap heap2;
  9.     char c;
  10.    
  11.     int count = 0;
  12.     ID1 = -1;
  13.     ID2 = -1;
  14.     deque<int> deq1;
  15.     deque<int> deq2;
  16.     int ID1toID2[N];
  17.     int ID2toID1[N];
  18.  
  19.     int N, M, K, ID;
  20.     N = 5;
  21.     M = 5;
  22.     int heapIdxToID[N];
  23.  
  24.     int a[N] = {1,2,3,4,5};
  25.  
  26.     for (int = 0; i < M; ++i)
  27.     {
  28.         cin >> c;
  29.         if (c == 'R')
  30.         {
  31.             count++;
  32.             R++;
  33.  
  34.             if (count < K)  //Не хватает - просто добавляем в 1 кучу
  35.             {
  36.                 ID1++;
  37.                 heap1.add(a[R], ID1); //ID1 - номер добавления элемента в 1 кучу
  38.                 deq1.push_back(ID1);
  39.                 cout << "-1" << endl;
  40.             }
  41.             if (count == K) //Только что набралось нужное число, просто добавляем к-ый и выводим
  42.             {
  43.                 ID1++;
  44.                 heap1.add(a[R], ID1);
  45.                 deq1.push_back(ID1);
  46.                 cout << heap1.get_root(); << endl;
  47.             }
  48.             if (count > K) //Появились лишние - их во вторую кучу (если больше корня, иначе в 1 а корень во вторую)
  49.             {
  50.                
  51.                 if (a[R] > heap1.get_root()) //Если больше корня то во вторую кучу просто
  52.                 {
  53.                     ID2++;
  54.                     heap2.add(a[R], ID2);
  55.                     deq2.push_back(ID2);
  56.                     cout << heap1.get_root() << endl;
  57.                 }
  58.                    
  59.                 else //Иначе корень стал уже к+1 и его во вторую надо  
  60.                             //!!!!!(тут все ломается по ID , вершина может уже быть в другой куче, тогда как ее найти про сдвиге L?)
  61.                 {
  62.                    
  63.                     root1_ID = heap1IdxToID[0];
  64.                     heap1.del(root1_ID); //Удаляю вершину (Раз его удаляю, то в очереди ID его тоже надо удалить как? - ID совпдают)
  65.                     //Вместо удаления запишу -ID2 добавления во вторую кучу
  66.  
  67.                     ID1++;
  68.                     heap1.add(a[R], ID1); //Добавляю новый элемент в 1 куче
  69.                     deq1.push_back(ID1)
  70.  
  71.                     ID2++;
  72.                     root1 = heap1.get_root();
  73.                     heap2.add(root1, ID2);  //Добавляю вершину 1 кучи во вторую, т.к она уже >k-ая статистика
  74.                     deq2.push_back(ID2);
  75.                     deq1[root1ID] = -ID2; //Вместо удаления запишу -ID2 добавления во вторую кучу чтобы потом понять где искать
  76.                     ID1toID2[root1ID] = ID2;
  77.                     ID2toID1[ID2] = root1ID;
  78.                 }
  79.             }
  80.         }
  81.         else
  82.         {
  83.             L--;
  84.             count--;
  85.             if (count < K) //Стало недостаточно, удаляем первый добавленный в 1 кучу
  86.             {
  87.                 ID = deq1[0]; //В deq1[0] лежит номер первого добавленного (крч лежит ID a[L])
  88.                 if (ID < 0) { //Значит элемент лежит во 2 куче и там его надо искать
  89.                     deq1.pop_front();
  90.                     //deq2.pop_front();
  91.                     heap2.del(-ID);
  92.                     cout << "-1" << endl;
  93.                 }
  94.                 else {
  95.                     deq1.pop_front();
  96.                     heap1.del(ID);
  97.                     cout << "-1" << endl;
  98.                 }
  99.             }
  100.             if (count >= K) //В 1 куче к-1, во 2 от 1. Надо удалить первый в 1 куче, перебросить из 2 кучи , удалить его и вывести
  101.             {
  102.                 ID = deq1[0];
  103.  
  104.                 if (ID < 0) { //Значит элемент лежит во 2 куче и там его надо искать
  105.                     deq1.pop_front();
  106.                     //deq2.pop_front();
  107.                     heap2.del(-ID);
  108.                 }
  109.                 else
  110.                 {
  111.                     deq1.pop_front();
  112.                     heap1.del(ID);   //удаляю из первой кучи первый туда добавленный
  113.                 }
  114.  
  115.                 ID1++;
  116.                 heap1.add(heap2.get_root(), ID1); // добавляю из 2 кучи в первую (по идее вседа в корень т.к. он больше остальных)
  117.                 //deq1.push_back(ID1);  //!!!!А не нарушиться ли от такого добавления порядок в массиве? надо же самый левый удалять
  118.                                             //Нарушиться. Но просто этого не надо делать только при R++ обновлять
  119.                 ID_top2 = heap2IdxToID[0]; //узнаю какой айди у вершины второй кучи
  120.                 heap2.del(ID_top2); //удаляю вершину у 2 кучи
  121.  
  122.                 //Теперь эту вершину надо искать в 1 куче (если после L++ надо ее удалить). Но где она лежит в deq1?
  123.                 deq1[ID2toID1[ID_top2]] = ID2toID1[ID_top2];
  124.                 cout << heap1.get_root() << endl;
  125.                 }
  126.             }
  127.            
  128.         }
  129.     }
  130.     return 0;
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment