vadimk772336

много cout

Nov 1st, 2021 (edited)
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.74 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.    
  107.     cout << "Только что добавили элемент в конец кучи" <<  endl;
  108.     if (sort_type == heap_max)
  109.         cout << "ID_to_Heap1Idx[ID]= " ;
  110.     else
  111.         cout << "ID_to_Heap2Idx[ID]= " ;
  112.     for (int j=0;j < ID_to_HeapIdx.size(); j++)
  113.         cout << ID_to_HeapIdx[j] << " ";
  114.     cout << endl;
  115.     cout << endl;
  116.    
  117.     if (sort_type == heap_max)
  118.         cout << "HeapIdx1_to_ID[ID]= " ;
  119.     else
  120.         cout << "HeapIdx2_to_ID[ID]= " ;
  121.     for (int j=0;j < HeapIdx_to_ID.size(); j++)
  122.         cout << HeapIdx_to_ID[j] << " ";
  123.     cout << endl;
  124.     cout << endl;
  125.    
  126.     heap_size++;
  127.     siftup(sort_type, ID, HeapIdx_to_ID);
  128.    
  129.     cout << "После сифтапа" << endl;
  130.     cout << "Только что добавили элемент в конец кучи" <<  endl;
  131.     if (sort_type == heap_max)
  132.         cout << "ID_to_Heap1Idx[ID]= " ;
  133.     else
  134.         cout << "ID_to_Heap2Idx[ID]= " ;
  135.     for (int j=0;j < ID_to_HeapIdx.size(); j++)
  136.         cout << ID_to_HeapIdx[j] << " ";
  137.     cout << endl;
  138.     cout << endl;
  139.    
  140.     if (sort_type == heap_max)
  141.         cout << "HeapIdx1_to_ID[ID]= " ;
  142.     else
  143.         cout << "HeapIdx2_to_ID[ID]= " ;
  144.     for (int j=0;j < HeapIdx_to_ID.size(); j++)
  145.         cout << HeapIdx_to_ID[j] << " ";
  146.     cout << endl;
  147.     cout << endl;
  148.  
  149. }
  150.  
  151. void Heap::siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  152. {
  153.     int parent, max_child, min_child, tmp, buff;
  154.  
  155.     int curr = ID_to_HeapIdx[ID];
  156.     int child_l = 2 * curr + 1;
  157.     int child_r = 2 * curr + 2;
  158.  
  159.  
  160.     if (h[child_r] < h[child_l])
  161.     {
  162.         max_child = child_l;
  163.         min_child = child_r;
  164.     }
  165.     else
  166.     {
  167.         max_child = child_r;
  168.         min_child = child_l;
  169.     }
  170.     while (child_l < heap_size)
  171.     {
  172.  
  173.        
  174.         if (sort_type == heap_max)
  175.         {
  176.             if (child_l == heap_size - 1)
  177.                 max_child = child_l;
  178.    
  179.             else if (h[child_r] < h[child_l])
  180.                 max_child = child_l;
  181.             else
  182.                 max_child = child_r;
  183.         }
  184.        
  185.         if (sort_type == heap_min)
  186.         {
  187.             if (child_l == heap_size - 1)
  188.                 min_child = child_l;
  189.             else if (h[child_r] < h[child_l])
  190.                 min_child = child_r;
  191.             else
  192.                 min_child = child_l;
  193.         }
  194.        
  195.         if (sort_type == heap_max & h[curr] < h[max_child])
  196.         {
  197.  
  198.             buff = h[curr];
  199.             h[curr] = h[max_child];
  200.             h[max_child] = buff;
  201.  
  202.             tmp = HeapIdx_to_ID[max_child];
  203.             HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  204.             HeapIdx_to_ID[curr] = tmp;
  205.  
  206.             tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  207.             ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  208.             ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  209.         }
  210.        
  211.         if (sort_type == heap_min & h[curr] > h[max_child])
  212.         {
  213.  
  214.             buff = h[curr];
  215.             h[curr] = h[max_child];
  216.             h[max_child] = buff;
  217.  
  218.             tmp = HeapIdx_to_ID[max_child];
  219.             HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  220.             HeapIdx_to_ID[curr] = tmp;
  221.  
  222.             tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  223.             ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  224.             ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  225.         }
  226.         curr = max_child;
  227.         child_l = 2 * curr + 1;
  228.         child_r = 2 * curr + 2;
  229.     }
  230. }
  231.  
  232.  
  233. void Heap::delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  234. {
  235.     int pos = ID_to_HeapIdx[ID];
  236.    
  237.     cout << "поступил запрос на удаление по ID= " << ID << "pos in heap = " << pos << endl;
  238.     cout << "h[pos]" << h[pos] << endl;
  239.    
  240.     cout << "DO" <<  endl;
  241.     if (sort_type == heap_max)
  242.         cout << "ID_to_Heap1Idx[ID]= " ;
  243.     else
  244.         cout << "ID_to_Heap2Idx[ID]= " ;
  245.     for (int j=0;j < ID_to_HeapIdx.size(); j++)
  246.         cout << ID_to_HeapIdx[j] << " ";
  247.     cout << endl;
  248.     cout << endl;
  249.    
  250.     if (sort_type == heap_max)
  251.         cout << "HeapIdx1_to_ID[ID]= " ;
  252.     else
  253.         cout << "HeapIdx2_to_ID[ID]= " ;
  254.     for (int j=0;j < HeapIdx_to_ID.size(); j++)
  255.         cout << HeapIdx_to_ID[j] << " ";
  256.     cout << endl;
  257.     cout << endl;
  258.    
  259.     h[pos] = h[heap_size - 1];
  260.     h.pop_back();
  261.     heap_size--;
  262.     //ID_to_HeapIdx[HeapIdx_to_ID[pos]] = -100; //Беру айди элемента pos и теперь Id[id] = -100;
  263.     //cout << "ID элемента которые лежит на pos " << HeapIdx_to_ID[pos] << " " << HeapIdx_to_ID[heap_size] << endl;
  264.     HeapIdx_to_ID[pos] = HeapIdx_to_ID[heap_size];
  265.     HeapIdx_to_ID[heap_size] = -100;
  266.     //cout << "ID элемента которые лежит на pos " << HeapIdx_to_ID[pos] << " " << HeapIdx_to_ID[heap_size] << endl;
  267.     //cout << "pos " << pos << heap_size << endl;
  268.     ID_to_HeapIdx[HeapIdx_to_ID[pos]] = pos; //Дают айди послед эл, а он уже на Pos
  269.     siftdown(sort_type, ID, HeapIdx_to_ID);
  270.     cout << "ID_to_HeapIdx[HeapIdx_to_ID[pos]] = " << ID_to_HeapIdx[HeapIdx_to_ID[pos]] << endl;
  271.    
  272.  
  273.     cout << "POSLE" <<  endl;
  274.     if (sort_type == heap_max)
  275.         cout << "ID_to_Heap1Idx[ID]= " ;
  276.     else
  277.         cout << "ID_to_Heap2Idx[ID]= " ;
  278.     for (int j=0;j < ID_to_HeapIdx.size(); j++)
  279.         cout << ID_to_HeapIdx[j] << " ";
  280.     cout << endl;
  281.     cout << endl;
  282.    
  283.     if (sort_type == heap_max)
  284.         cout << "HeapIdx1_to_ID[ID]= " ;
  285.     else
  286.         cout << "HeapIdx2_to_ID[ID]= " ;
  287.     for (int j=0;j < HeapIdx_to_ID.size(); j++)
  288.         cout << HeapIdx_to_ID[j] << " ";
  289.     cout << endl;
  290.     cout << endl;
  291. }
  292.  
  293.  
  294. void Heap::out(void)
  295. {
  296.  
  297.     for (int i = 0; i < heap_size; i++)
  298.     {
  299.         cout << h[i] << " ";
  300.     }
  301.     cout << endl;
  302. }
  303.  
  304. int main()
  305. {
  306.     Heap heap1;
  307.     Heap heap2;
  308.     std::vector<int> HeapIdx1_to_ID;
  309.     std::vector<int> HeapIdx2_to_ID;
  310.     char c;
  311.  
  312.     int count = 1;
  313.     int ID1 = -1;
  314.     int ID2 = -1;
  315.     deque<int> deq1;
  316.     deque<int> deq2;
  317.  
  318.     int N, M, K, ID, root1_ID, root2_ID;
  319.     N = 4;
  320.     M = 6;
  321.     K = 1;
  322.  
  323.  
  324.     int ID1toID2[N];
  325.     int ID2toID1[N];
  326.  
  327.     int R = 0, L = 0;
  328.     //int a[N] = { 4, 2, 1, 3, 6, 5, 7 };
  329.     int a[N] = { 1,2,3,4};
  330.  
  331.  
  332.     ID1++;
  333.     heap1.add(heap_max, a[0], ID1, HeapIdx1_to_ID);
  334.     deq1.push_back(ID1);
  335.     cout << "До цикла heap1 :";
  336.     heap1.out();
  337.     cout << "До цикла heap2 :";
  338.     heap2.out();
  339.     for (int i = 1; i < M; ++i)
  340.     {
  341.         cin >> c;
  342.         if (c == 'R')
  343.         {
  344.             count++;
  345.             R++;
  346.             cout << "----------------" << endl;
  347.             cout << "R; R = " << R << " count =" << count << endl;
  348.             if (count < K)
  349.             {
  350.                 cout << "count < K, просто добавляю в кучу" << endl;
  351.                 ID1++;
  352.                 heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  353.                 deq1.push_back(ID1);            
  354.                 cout << "heap1 :";
  355.                 heap1.out();
  356.                 cout << "heap2 :";
  357.                 heap2.out();
  358.                  cout << "deq1: ";
  359.                     for (int j=0; j < deq1.size(); ++j) {
  360.                         cout << deq1[j] << " ";
  361.                     }
  362.                 cout << "answer: " << "-1" << endl;
  363.             }
  364.             if (count == K)
  365.             {
  366.                 cout << "count == K, просто добавляю в кучу" << endl;
  367.                 ID1++;
  368.                 heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  369.                 deq1.push_back(ID1);
  370.                cout << "deq1: ";
  371.                     for (int j=0; j < deq1.size(); ++j) {
  372.                         cout << deq1[j] << " ";
  373.                     }
  374.                 cout << "answer: " << heap1.get_root() << endl;
  375.                 cout << "heap1 :";
  376.                 heap1.out();
  377.                 cout << "heap2 :";
  378.                 heap2.out();
  379.             }
  380.             if (count > K)
  381.             {
  382.                 cout << "count > K, Появились лишние - их во вторую кучу (если больше корня, иначе в 1 а корень во вторую)" << endl;
  383.  
  384.                 if (a[R] > heap1.get_root())
  385.                 {
  386.                     cout << "a[R] больше корня - во вторую кучу просто" << endl;
  387.                    
  388.                     ID2++;
  389.                     heap2.add(heap_min, a[R], ID2, HeapIdx2_to_ID);
  390.                     deq2.push_back(ID2);
  391.                     cout << "answer: " << heap1.get_root() << endl;
  392.                     cout << "heap1 :";
  393.                     heap1.out();
  394.                     cout << "heap2 :";
  395.                     heap2.out();
  396.                 }
  397.  
  398.                 else
  399.  
  400.                 {
  401.                    
  402.                     cout << "a[R] < корня, корень стал уже к+1 и его во вторую надо  " << endl;
  403.  
  404.                     cout << endl;
  405.                     root1_ID = HeapIdx1_to_ID[0];
  406.                     int root1 = heap1.get_root(); //Запоминаю вершину до удаления
  407.                     heap1.delete_vertex(heap_max, root1_ID, HeapIdx1_to_ID);
  408.  
  409.                     cout << "do0 deq1: ";
  410.                     for (int j=0; j < deq1.size(); ++j) {
  411.                         cout << deq1[j] << " ";
  412.                     }
  413.                     ID1++;
  414.                     heap1.add(heap_max, a[R], ID1, HeapIdx1_to_ID);
  415.                     deq1.push_back(ID1);
  416.  
  417.                     ID2++;
  418.                     heap2.add(heap_min, root1, ID2, HeapIdx2_to_ID);
  419.                     deq2.push_back(ID2);
  420.                     cout << "do deq1: ";
  421.                     for (int j=0; j < deq1.size(); ++j) {
  422.                         cout << deq1[j] << " ";
  423.                     }
  424.                     cout << endl;
  425.                     deq1[root1_ID] = -ID2-1;  //!!!!!  Означает что лежит во второй куче на ID2
  426.                     cout << "posle deq1: ";
  427.                     for (int j=0; j < deq1.size(); ++j) {
  428.                         cout << deq1[j] << " ";
  429.                     }
  430.                     cout << endl;
  431.                     ID1toID2[root1_ID] = ID2;
  432.                     ID2toID1[ID2] = root1_ID;
  433.                     cout << "answer: " << heap1.get_root() << endl;
  434.                     cout << "heap1 :";
  435.                     heap1.out();
  436.                     cout << "heap2 :";
  437.                     heap2.out();
  438.                 }
  439.             }
  440.         }
  441.         else
  442.         {
  443.             L++;
  444.             count--;
  445.             cout << "----------------" << endl;
  446.             cout << "L,count = " << L << " " << count << endl;
  447.             if (count < K)
  448.             {
  449.                 cout << "count < K /Стало недостаточно, удаляем первый добавленный в 1 кучу " << endl;
  450.                 ID = deq1[0];
  451.                 if (ID < 0)
  452.                 {
  453.                     cout << "Значит элемент лежит во 2 куче и там его надо искать" << endl;
  454.                     deq1.pop_front();
  455.  
  456.                     heap2.delete_vertex(heap_min, -ID, HeapIdx2_to_ID);
  457.                     cout << "answer: " << "-1" << endl;
  458.                     cout << "heap1 :";
  459.                     heap1.out();
  460.                     cout << "heap2 :";
  461.                     heap2.out();
  462.                 }
  463.                 else
  464.                 {
  465.                     cout << "Значит элемент лежит в 1 куче и там его надо искать" << endl;
  466.                     deq1.pop_front();
  467.                     heap1.delete_vertex(heap_max, ID, HeapIdx1_to_ID);
  468.                     cout << "answer: " << "-1" << endl;
  469.                     cout << "heap1 :";
  470.                     heap1.out();
  471.                     cout << "heap2 :";
  472.                     heap2.out();
  473.                 }
  474.             }
  475.             if (count >= K)
  476.             {
  477.                 cout << "count >= K; В 1 куче к-1, во 2 не пусто. Надо удалить первый в 1 куче, перебросить из 2 кучи , удалить его и вывести " << endl;
  478.                 cout << "deq1: ";
  479.                 for (int j=0; j < deq1.size(); ++j) {
  480.                     cout << deq1[j] << " ";
  481.                 }
  482.                 cout << endl;
  483.                
  484.                 ID = deq1[0];
  485.                 cout << "ID= " << ID << endl;
  486.                
  487.                 if (ID < 0)
  488.                 {
  489.                    
  490.                     //ID = ID1toID2;
  491.                     cout << "Тот, кого нужно удалить находится во 2 куче, удаляем его" << endl;
  492.                     cout << "TrueID= " << -ID-1 << endl;
  493.                     deq1.pop_front();
  494.  
  495.                     heap2.delete_vertex(heap_min, -ID-1, HeapIdx2_to_ID);
  496.                     cout << "heap1 :";
  497.                     heap1.out();
  498.                     cout << "heap2 :";
  499.                     heap2.out();
  500.                    
  501.                     cout << "Так как удаляли из 2 кучи, первая не пострадала ничего не делаем" << endl;
  502.                     cout << "answer: " << heap1.get_root() << endl;
  503.                 }
  504.                 else
  505.                 {
  506.                     cout << "Тот, кого нужно удалить находится в 1 куче, удаляем его" << endl;
  507.                     deq1.pop_front();
  508.                     heap1.delete_vertex(heap_max, ID, HeapIdx1_to_ID);
  509.                     cout << "heap1 :";
  510.                     heap1.out();
  511.                     cout << "heap2 :";
  512.                     heap2.out();
  513.                     cout << "Так как удаляли из 1 кучи, надо перебросить" << endl;
  514.                    
  515.                     ID1++;
  516.                     heap1.add(heap_max, heap2.get_root(), ID1, HeapIdx1_to_ID);
  517.    
  518.    
  519.                     int ID_top2 = HeapIdx2_to_ID[0];
  520.                     heap2.delete_vertex(heap_min, ID_top2, HeapIdx2_to_ID);
  521.                    cout << "do deq1: ";
  522.                     for (int j=0; j < deq1.size(); ++j) {
  523.                         cout << deq1[j] << " ";
  524.                     }
  525.                     cout << endl;
  526.                     deq1[ID2toID1[ID_top2]] = ID2toID1[ID_top2];
  527.                    cout << "posle deq1: ";
  528.                     for (int j=0; j < deq1.size(); ++j) {
  529.                         cout << deq1[j] << " ";
  530.                     }
  531.                     cout << endl;
  532.                     cout << "answer: " << heap1.get_root() << endl;
  533.                     cout << "heap1 :";
  534.                     heap1.out();
  535.                     cout << "heap2 :";
  536.                     heap2.out();
  537.                 }
  538.             }
  539.         }
  540.     }
  541.  
  542. return 0;
  543. }
  544.  
Add Comment
Please, Sign In to add comment