Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.56 KB | None | 0 0
  1. // Treap2.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5.  
  6. #include <stdio.h>
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11.  
  12. struct Node {
  13. int key, prior;
  14. Node* l = 0, *r = 0;
  15. Node(int _key) { key = _key, prior = rand(); }
  16. Node(int _key, int _p) { key = _key, prior = _p; }
  17. friend ostream& operator<<(ostream& stream, Node& N)
  18. {
  19. if (N.l != 0)
  20. stream << *N.l;
  21. stream << N.key << "; " << N.prior << "\n";
  22. if (N.r != 0)
  23. stream << *N.r;
  24. return stream;
  25. }
  26. };
  27.  
  28. Node* root = 0;
  29.  
  30. Node* merge(Node* l, Node* r) {
  31. if (!l) return r;
  32. if (!r) return l;
  33. if (l->prior > r->prior) {
  34. l->r = merge(l->r, r);
  35. return l;
  36. }
  37. else {
  38. r->l = merge(l, r->l);
  39. return r;
  40. }
  41. }
  42.  
  43. typedef pair<Node*, Node*> Pair;
  44.  
  45. Pair split(Node* p, int x) {
  46. if (!p) return { 0, 0 };
  47. if (p->key < x) {
  48. Pair q = split(p->r, x);
  49. p->r = q.first;
  50. return { p, q.second };
  51. }
  52. else {
  53. Pair q = split(p->l, x);
  54. p->l = q.second;
  55. return { q.first, p };
  56. }
  57. }
  58.  
  59. void insert(int x) {
  60. if (root == 0)
  61. {
  62. root = new Node(x);
  63. return;
  64. }
  65. Pair q = split(root, x);
  66. Node* t = new Node(x);
  67. root = merge(q.first, merge(t, q.second));
  68. }
  69.  
  70. Node* copy(int b = -1)
  71. {
  72. Node* cur = new Node;
  73. cur->key = key;
  74. cur->prior = prior;
  75. Node* left1;
  76. Node* right1;
  77. if (b!=1 && l!=NULL)
  78. left1 = l->copy();
  79. else
  80. left1 = NULL;
  81. if (b!=0 && r!=NULL)
  82. right1 = r->copy();
  83. else
  84. right1 = NULL;
  85. cur->l = left1;
  86. cur->r = right1;
  87. return cur;
  88. }
  89.  
  90. class Treap
  91. {
  92. public:
  93. Node* root;
  94.  
  95. //добавить поле, которое можно хранить и поддерживать в узле
  96. Treap(Node* n = NULL)
  97. {
  98. root = n;
  99. }
  100.  
  101. Treap* Merge(Treap* T)
  102. {
  103. Treap *copy_this, *copy_T;
  104. copy_this = new Treap(copy(this));
  105. copy_T = new Treap(copy(T));
  106. Treap* res = new Treap();
  107. res->root = merge(copy_this->root, copy_T->root);
  108. delete this;
  109. delete T;
  110. return res;
  111. }
  112.  
  113.  
  114. void Split(int x, Node* eq, Treap* left, Treap* right)
  115. {
  116. Node* croot <= root;
  117. Pair p1 = split(croot, x);
  118. left = new Treap(p1.first);
  119. right = new Treap(p1.second);
  120. Node* cur = p1.second;
  121. while (cur->l)
  122. cur = cur->l;
  123.  
  124. if (cur->key == x)
  125. {
  126. eq <= cur;
  127. delete cur;
  128. }
  129. else
  130. eq = nullptr;
  131. }
  132.  
  133.  
  134. ~Treap()
  135. {
  136.  
  137. }
  138.  
  139. friend ostream& operator<<(ostream& stream, Treap& T)
  140. {
  141. if(T.root!=NULL)
  142. stream<<*T.root;
  143. else
  144. stream<<"\nEmpty treap!";
  145. return stream;
  146. }
  147. };
  148.  
  149. int main()
  150. {
  151. Node* N1 = new Node(0, 100);
  152. root = N1;
  153. Node* N2 = new Node(10, 50);
  154. Node* N3 = new Node(20, 25);
  155. Node* N4 = new Node(30, 55);
  156. Node* N5 = new Node(40, 10);
  157. merge(root, N2);
  158. merge(root, N3);
  159. merge(root, N4);
  160. merge(root, N5);
  161.  
  162. Pair p = split(root, 30);
  163. cout << *p.first << "\n\n" << *p.second;
  164. //insert(1);insert(10);insert(0);insert(-5);insert(3);
  165. cout << *root;
  166.  
  167. return 0;
  168. }
  169.  
  170.  
  171. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  172. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  173.  
  174. // Советы по началу работы
  175. // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  176. // 2. В окне Team Explorer можно подключиться к системе управления версиями.
  177. // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  178. // 4. В окне "Список ошибок" можно просматривать ошибки.
  179. // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  180. // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement