hurmawe

Декартовое дерево по неявному ключу 4а

Mar 12th, 2021 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. struct node // функции по добавлению новых значений можно объединить
  2. {
  3.     uint8_t color     = NULL;
  4.     int value_node    = NULL;
  5.     int size          = NULL;
  6.     int sum           = NULL;
  7.     int add           = NULL;
  8.     int add_color     = NULL;
  9.  
  10.     node* left = nullptr;
  11.     node* right = nullptr;
  12.    
  13.     node(int new_value)
  14.     {
  15.         value_node = new_value;
  16.         size = 1;
  17.     }
  18.     node(uint8_t new_color)
  19.     {
  20.         color = new_color;
  21.        
  22.     }
  23. };
  24.  
  25. void add_color(node* A, int color, int left_face, int right_face) // // размещение цвета
  26. {
  27.     Pair left = split(A, left_face);
  28.     Pair right = split(left.second, right_face);
  29.  
  30.     right.first->add_color = color;
  31.  
  32.     left.second = merge(right.first, right.second);
  33.     merge(left.first, left.second);
  34. }
  35.  
  36. void color_push_down(node* A) // проталкивание с замещением
  37. {
  38.     if (A->left != nullptr)
  39.     {
  40.         A->left->color = A->add_color;
  41.     }
  42.     if (A->right != nullptr)
  43.     {
  44.         A->right->color = A->add_color;
  45.     }
  46.     A->color = A->add_color;
  47.     A->add_color = 0;
  48. }
  49.  
  50. void mix_color_push_down(node* A) // проталкивание с смешиванием
  51. {
  52.     if (A->left != nullptr)
  53.     {
  54.         A->left->color = (A->add_color + A->left->color) / 2;
  55.     }
  56.     if (A->right != nullptr)
  57.     {
  58.         A->right->color = (A->add_color + A->right->color) / 2;
  59.     }
  60.     A->color = (A->add_color + A->color) / 2;
  61.     A->add_color = 0;
  62. }
  63.  
  64. node* merge(node* A,node* B) // пример размещение функции ( push_down() и color_push_down() также можно объединить)
  65. {
  66.     push_down(A);
  67.     push_down(B);
  68.     color_push_down(A);
  69.     color_push_down(B);
  70.     if (!A) return B;
  71.     if (!B) return A;
  72.  
  73.     if (A->size > B->size)
  74.     {
  75.         A->right = merge(A->right, B);
  76.         return A;
  77.     }
  78.     else
  79.     {
  80.         B->left = merge(A, B->left);
  81.         return B;
  82.     }
  83. }
Add Comment
Please, Sign In to add comment