Advertisement
Guest User

Untitled

a guest
Sep 24th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct lst {
  6. lst *next = nullptr, *prev = nullptr;
  7. int key;
  8.  
  9. lst() {}
  10. };
  11.  
  12. lst* get_end(lst *t) {
  13. if (t->next == nullptr) return t;
  14. lst *c = t;
  15. while (c->next->next != nullptr)
  16. c = c->next;
  17. return c;
  18. }
  19.  
  20. pair<lst*, lst*> split(lst *t, int k) {
  21. if (k == 0)
  22. return {nullptr, t};
  23. int cnt = 0;
  24. lst *c = t;
  25. while (c->next != nullptr) {
  26. ++cnt;
  27. if (cnt == k) {
  28. lst *tm = c->next;
  29. c->next->prev = nullptr;
  30. c->next = new lst();
  31. c->next->prev = c;
  32. return {t, tm};
  33. }
  34. c = c->next;
  35. }
  36. return {t, nullptr};
  37. }
  38.  
  39. lst* merge(lst *l, lst *r) {
  40. if (l == nullptr) return r;
  41. if (l->next == nullptr) {delete(l); return r;}
  42. lst *t = get_end(l);
  43. delete(t->next);
  44. t->next = r;
  45. r->prev = t;
  46. return l;
  47. }
  48.  
  49. mt19937 gen(time(0));
  50. uniform_int_distribution<int> dis(0, 1148822869);
  51.  
  52. void read(lst *t, int n) {
  53. lst *c = get_end(t);
  54. for (int i = 0; i < n; i++) {
  55. int x = dis(gen) % 1000000;
  56. //cin >> x;
  57. c->key = x;
  58. c->next = new lst();
  59. c->next->prev = c;
  60. c = c->next;
  61. }
  62. }
  63.  
  64. void print(lst *t) {
  65. lst *c = t;
  66. int ls = -1000000;
  67. bool flg = 1;
  68. while (c->next != nullptr) {
  69. if (c->key < ls) {
  70. // flg = 0;
  71. // break;
  72. }
  73. ls = c->key;
  74. cout << c->key << ' ';
  75. c = c->next;
  76. }
  77. //out << (flg ? "YES" : "NO");
  78. }
  79.  
  80. void print_back(lst *t) {
  81. lst *c = get_end(t);
  82. int ls = 1000000000;
  83. while (c != nullptr) {
  84. if (c->key > ls) {
  85. cout << "NO";
  86. return;
  87. }
  88. c = c->prev;
  89. }
  90. cout << "YES";
  91. }
  92.  
  93. int get_size(lst *t) {
  94. int sz = 0;
  95. lst *c = t;
  96. while (c->next != nullptr) {
  97. c = c->next;
  98. ++sz;
  99. }
  100. return sz;
  101. }
  102.  
  103. void append(lst *&t, int x) {
  104. t->key = x;
  105. t->next = new lst();
  106. t->next->prev = t;
  107. t = t->next;
  108. }
  109.  
  110. void erase_list(lst *t) {
  111. while (t->next != nullptr) {
  112. lst *p = t->next;
  113. delete(t);
  114. t = p;
  115. }
  116. delete(t);
  117. }
  118.  
  119. void merge_sort(lst *&t) {
  120. if (t->next == nullptr || t->next->next == nullptr) return;
  121. int sz = get_size(t);
  122. auto gg = split(t, sz / 2);
  123. lst *l = gg.first, *r = gg.second;
  124. merge_sort(l); merge_sort(r);
  125. lst *cl = l, *cr = r, *np;
  126. if (cl->key < cr->key) {
  127. np = cl;
  128. cl = cl->next;
  129. } else {
  130. np = cr;
  131. cr = cr->next;
  132. }
  133. lst *nl = np;
  134. while (cl->next != nullptr && cr->next != nullptr) {
  135. if (cl->key < cr->key) {
  136. nl->next = cl;
  137. cl->prev = nl;
  138. cl = cl->next;
  139. nl = cl;
  140. } else {
  141. nl->next = cr;
  142. cr->prev = nl;
  143. cr = cr->next;
  144. nl = cr;
  145. }
  146. }
  147. if (cl->next != nullptr) {
  148. nl->prev->next = cl;
  149. cl->prev = nl->prev;
  150. } else {
  151. nl->prev->next = cr;
  152. cr->prev = nl->prev;
  153. }
  154. t = np;
  155. }
  156.  
  157. int main() {
  158. //freopen("input.txt", "r", stdin);
  159. int n;
  160. cin >> n;
  161. lst *L = new lst();
  162. read(L, n);
  163. merge_sort(L);
  164. print(L);
  165. return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement