vadimk772336

работает (с принтами)

Dec 9th, 2021
841
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.07 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int MAX = 2e5;
  7.  
  8. struct vertex
  9. {
  10.     int res;
  11.     int left;
  12.     int right;
  13. };
  14.  
  15. class Segment_Tree
  16. {
  17.     struct vertex* tree;
  18.     int tree_size;
  19.     int count_numbers;
  20.     std::vector<int> numbers;
  21.  
  22. public:
  23.     void build_tree(int v, int tl, int tr);
  24.     int to_deg_of_two(std::vector<int>& numbers, int count_numbers);
  25.     void Initialize(int count_numbers);
  26.     void set(int k, int x);
  27.     int get_min(int node, int a, int b);
  28.     int find_spot(int start_number);
  29.     int free_up(int number);
  30.     void print_tree();
  31. };
  32.  
  33. void Segment_Tree::build_tree(int v, int tl, int tr)
  34. {
  35.  
  36.     //////cout << "numbers:" << endl;
  37.     //for (int j  = 0; j < this->numbers.size(); ++j)
  38.     //    ////cout << numbers[j] << " ";
  39.     //////cout << endl;
  40.    
  41.     if (tr - tl == 1)
  42.     {
  43.         //////cout << "* tl, tr  = " << tl << " " << tr;
  44.         this->tree[v].res = this->numbers[tl];
  45.         this->tree[v].left = tl;
  46.         this->tree[v].right = tr;
  47.         //////cout << " v = " << v <<  " this->tree[v] = " << this->tree[v].res << endl;
  48.         //print_tree();
  49.         //////cout << "-------------" << endl;
  50.     }
  51.     else
  52.     {
  53.         //////cout << " tl, tr  = " << tl << " " << tr << endl;
  54.         int tm = (tl + tr) / 2;
  55.         build_tree(v * 2 + 1, tl, tm);
  56.         build_tree(v * 2 + 2, tm, tr);
  57.         this->tree[v].left = tl;
  58.         this->tree[v].right = tr;
  59.  
  60.         if (tree[v * 2 + 1].res < tree[v * 2 + 2].res)
  61.             this->tree[v].res = tree[v * 2 + 1].res;
  62.         else
  63.             this->tree[v].res = tree[v * 2 + 2].res;
  64.        
  65.         //print_tree();
  66.         //////cout << "-------------" << endl;
  67.         //////cout << "v = " << v <<  " this->tree[v] = " << this->tree[v].res << endl;
  68.     }
  69. }
  70.  
  71. int Segment_Tree::to_deg_of_two(std::vector<int>& numbers, int count_numbers)
  72. {
  73.  
  74.     int p = 1;
  75.     while (count_numbers > p)
  76.         p *= 2;
  77.  
  78.     for (int i = 0; i < p - count_numbers; ++i)
  79.         this->numbers.push_back(MAX);
  80.  
  81.     return p;
  82. }
  83.  
  84. void Segment_Tree::Initialize(int count_numbers)
  85. {
  86.  
  87.  
  88.    
  89.     this->count_numbers = count_numbers;
  90.     this->numbers.clear();
  91.     this->numbers.resize(count_numbers);
  92.    
  93.     for (int i = 1; i <= count_numbers; ++i)
  94.         this->numbers[i-1] = i;
  95.  
  96.     this->count_numbers = to_deg_of_two(numbers, count_numbers);
  97.     this->tree_size = 2*this->count_numbers-1;
  98.     this->tree = new vertex[tree_size];
  99.    
  100.     cout << "this->count_numbers = " << this->count_numbers << endl;
  101.     cout << "this->tree_size = " << this->tree_size << endl;
  102.     build_tree(0, 0, this->count_numbers);
  103. }
  104.  
  105.  
  106. void Segment_Tree::set(int k, int x)
  107. {
  108.     ////cout << "вызвана функция set от " << k << " " << x <<  " " << endl;
  109.     int v = this->count_numbers -1 + k;
  110.     ////cout << "v = " << v << endl;
  111.     this->tree[v].res = x;
  112.     //////cout << "this->tree[v] = " << this->tree[v].res << endl;
  113.     while (v > 0)
  114.     {
  115.         v = (v - 1) / 2;
  116.  
  117.         int l_min = tree[2 * v + 1].res;
  118.         int r_min = tree[2 * v + 2].res;
  119.         //////cout << "l, r " << l_min << " " << r_min << endl;
  120.         (l_min < r_min) ? this->tree[v].res = l_min : this->tree[v].res = r_min;
  121.     }
  122.    
  123.     //////cout << "end set" << endl;
  124.     //print_tree();
  125.    
  126. }
  127.  
  128. int Segment_Tree::get_min(int node, int a, int b)
  129. {
  130.     int l = tree[node].left;
  131.     int r = tree[node].right;
  132.     if (r <= a || l >= b)
  133.         return MAX;
  134.  
  135.     if (r < b & l >= a)
  136.         return tree[node].res;
  137.  
  138.     int m1 = get_min(node * 2 + 1, a, b);
  139.     int m2 = get_min(node * 2 + 2, a, b);
  140.     return (m1 < m2) ? m1 : m2;
  141. }
  142.  
  143. int Segment_Tree::find_spot(int start_number)
  144. {
  145.  
  146.     int pos = (start_number-1) + (this->tree_size - this->count_numbers);
  147.    
  148.     cout << "Начинаю искать с места " << start_number << " оно на индексе " << pos << endl;
  149.     //print_tree();
  150.     if (tree[pos].res != MAX)
  151.     {
  152.        
  153.         set(start_number-1, MAX);
  154.         cout << "Оно свободно, выведу его , и поставлю МАХ  " << tree[pos].res << endl;
  155.         //print_tree();
  156.         return start_number;
  157.     }
  158.    
  159.     else
  160.     {
  161.         cout << "Оно оказалось занято " << endl;
  162.         print_tree();
  163.         int min_num = get_min(0, start_number-1, this->count_numbers+1);
  164.    
  165.         if (min_num == MAX)
  166.         {
  167.             cout << "НЕ нашёл минимум спрва, ищу слева" << endl;
  168.             min_num = get_min(0, 0, start_number);
  169.    
  170.             if (min_num == MAX)
  171.                 return -1;
  172.             else
  173.             {
  174.                 set(min_num - 1, MAX);
  175.                 return min_num;
  176.             }
  177.         }
  178.    
  179.         else
  180.         {
  181.             cout << "нашёл минимум спрва" << endl;
  182.             set(min_num - 1, MAX);
  183.             return min_num;
  184.         }
  185.     }
  186. }
  187.  
  188. int Segment_Tree::free_up(int number)
  189. {
  190.     int pos = (number-1) + (this->tree_size - this->count_numbers);
  191.    
  192.     if (tree[pos].res == MAX)
  193.     {
  194.         set(number - 1, number);
  195.         return 0;
  196.     }
  197.     else
  198.         return -2;
  199. }
  200.  
  201. void Segment_Tree::print_tree()
  202. {
  203.     int k = 2;
  204.     cout << "\ni= " << 0 << " (" << tree[0].left << ";" << tree[0].right << "): " << tree[0].res << endl;
  205.     for (int i=1; i < this->tree_size; ++i)
  206.     {
  207.         if (i == 2*k-1)
  208.         {
  209.             k *= 2;
  210.             cout << endl;
  211.         }
  212.         cout << "i= " << i << " (" << tree[i].left << ";" << tree[i].right << "): " << tree[i].res << "; ";
  213.     }
  214.     cout << endl;
  215. }
  216.  
  217. int main()
  218. {
  219.  
  220.     int n, m;
  221.     char s;
  222.     string number;
  223.     cin >> n >> m;
  224.  
  225.     Segment_Tree tree;
  226.     tree.Initialize(n);
  227.    
  228.  
  229.     for (int i = 0; i < m; ++i)
  230.     {
  231.  
  232.         cin >> s;
  233.         cin >> number;
  234.         int num = stoi(number);
  235.         if (s == '+')
  236.             cout << tree.find_spot(num) << endl;
  237.         else
  238.             cout << tree.free_up(num) << endl;
  239.     }
  240.  
  241.     return 0;
  242. }
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
Advertisement
Add Comment
Please, Sign In to add comment