Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <unordered_map>
  5. #include <algorithm>
  6. #include <set>
  7.  
  8. using namespace std;
  9.  
  10.  
  11. vector<int> tree;
  12. int module;
  13.  
  14. void update(int i, int x) {
  15. i += module; tree[i] = x;
  16. while (i /= 2)
  17. tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
  18. }
  19.  
  20. int get_min(int l, int r) {
  21. int ans = 1000000000;
  22. int i = l + module;
  23. int j = r + module;
  24. while (i <= j) {
  25. if (i % 2 == 1) ans = min(ans, tree[i]);
  26. if (j % 2 == 0) ans = min(ans, tree[j]);
  27. i = (i + 1) / 2;
  28. j = (j - 1) / 2;
  29. }
  30. return ans;
  31. }
  32.  
  33. void init(int n) {
  34. module = 2 * n + 100;
  35. tree.resize(2 * (n + module) + 100, 0);
  36. }
  37.  
  38. vector<int> a;
  39. vector<vector<int>> p;
  40. vector<int> ans;
  41.  
  42. //set<pair<pair<int, int>, int>> sset;
  43. set<pair<int, int>> sset;
  44. int n, k;
  45. /*
  46. void doReplace() {
  47. ans.clear();
  48. ans.reserve(k);
  49. for (auto& item : sset) {
  50. ans.push_back(item.first.second);
  51. }
  52. }
  53. */
  54.  
  55. int main() {
  56. ios_base::sync_with_stdio(false);
  57. cin >> n >> k;
  58. a.resize(n);
  59. p.resize(k);
  60. for (int i = 0; i < n; i++) {
  61. cin >> a[i];
  62. a[i]--;
  63. p[a[i]].push_back(i);
  64. }
  65. for (int i = 0; i < k; i++) {
  66. sset.insert({p[i].back(), i});
  67. }
  68.  
  69. init(n);
  70. for (int i = 0; i < n; i++) {
  71. update(i, a[i]);
  72. }
  73.  
  74. ans.reserve(k);
  75.  
  76. int l = 0;
  77. for (int i = 0; i < k; i++) {
  78. int res = get_min(l, sset.begin()->first);
  79. int pos = *lower_bound(p[res].begin(), p[res].end(), l);
  80. ans.push_back(res);
  81. //cout << i << " " << l << " | " << res << " " << pos << endl;
  82. sset.erase(sset.find({p[res].back(), res}));
  83. for (auto item : p[res]) {
  84. update(item, 1000000000);
  85. }
  86. l = pos + 1;
  87. }
  88.  
  89. /*
  90. int cur_pos = 0;
  91. for (int i = 0; i < k; i++) {
  92. int j = 0;
  93. while (couldGet(cur_pos, j)) {
  94.  
  95. }
  96.  
  97. }
  98.  
  99.  
  100.  
  101. sset.insert({{p[i][0], i}, 0});
  102. doReplace();
  103.  
  104. while (true) {
  105. auto cur = *sset.begin();
  106. sset.erase(sset.begin());
  107. if (cur.second + 1 == (int)p[cur.first.second].size()) {
  108. break;
  109. }
  110. cur.second++;
  111. cur.first.first = p[cur.first.second][cur.second];
  112. sset.insert(cur);
  113. bool replace = false;
  114. if (sset.begin()->first.second != cur.first.second) {
  115. int pos = 0;
  116. for (auto& item : sset) {
  117. if (item.first.second != ans[pos]) {
  118. replace = item.first.second < ans[pos];
  119. break;
  120. }
  121. pos++;
  122. }
  123. }
  124. if (replace) {
  125. doReplace();
  126. }
  127. }
  128. * */
  129.  
  130. /*
  131.  
  132. ans = a;
  133. int i = 0;
  134. while (i < n) {
  135. int last = 0;
  136. for (int j = 0; j < k; j++) {
  137. auto it = lower_bound(p[j].begin(), p[j].end(), i);
  138. if (it == p[j].end()) {
  139. last = -1;
  140. break;
  141. }
  142. last = max(last, *it);
  143. }
  144. if (last == -1) {
  145. break;
  146. }
  147. cout << i << " " << last - i + 1 << endl;
  148. bool replace = (last - i + 1) < (int)ans.size();
  149. if (last - i + 1 == (int)ans.size()) {
  150. for (int j = 0; j < last - i; j++) {
  151. if (a[i + j] != ans[j]) {
  152. replace = a[i + j] < ans[j];
  153. break;
  154. }
  155. }
  156. }
  157. if (replace) {
  158. ans = std::vector<int>(a.begin() + i, a.begin() + last + 1);
  159. }
  160. i++;
  161. }
  162. */
  163. for (auto item : ans) {
  164. cout << item + 1 << " ";
  165. }
  166.  
  167. return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement