Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 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. vector<int> a;
  11. vector<vector<int>> p;
  12. vector<int> ans;
  13.  
  14. set<pair<pair<int, int>, int>> sset;
  15. int n, k;
  16.  
  17. void doReplace() {
  18. ans.clear();
  19. ans.reserve(k);
  20. for (auto& item : sset) {
  21. ans.push_back(item.first.second);
  22. }
  23. }
  24.  
  25. int main() {
  26. ios_base::sync_with_stdio(false);
  27. cin >> n >> k;
  28. a.resize(n);
  29. p.resize(k);
  30. for (int i = 0; i < n; i++) {
  31. cin >> a[i];
  32. a[i]--;
  33. p[a[i]].push_back(i);
  34. }
  35. for (int i = 0; i < k; i++) {
  36. sset.insert({{p[i][0], i}, 0});
  37. }
  38. doReplace();
  39.  
  40. while (true) {
  41. auto cur = *sset.begin();
  42. sset.erase(sset.begin());
  43. if (cur.second + 1 == (int)p[cur.first.second].size()) {
  44. break;
  45. }
  46. cur.second++;
  47. cur.first.first = p[cur.first.second][cur.second];
  48. sset.insert(cur);
  49. bool replace = false;
  50. if (sset.begin()->first.second != cur.first.second) {
  51. int pos = 0;
  52. for (auto& item : sset) {
  53. if (item.first.second != ans[pos]) {
  54. replace = item.first.second < ans[pos];
  55. break;
  56. }
  57. pos++;
  58. }
  59. }
  60. if (replace) {
  61. doReplace();
  62. }
  63. }
  64.  
  65. /*
  66.  
  67. ans = a;
  68. int i = 0;
  69. while (i < n) {
  70. int last = 0;
  71. for (int j = 0; j < k; j++) {
  72. auto it = lower_bound(p[j].begin(), p[j].end(), i);
  73. if (it == p[j].end()) {
  74. last = -1;
  75. break;
  76. }
  77. last = max(last, *it);
  78. }
  79. if (last == -1) {
  80. break;
  81. }
  82. cout << i << " " << last - i + 1 << endl;
  83. bool replace = (last - i + 1) < (int)ans.size();
  84. if (last - i + 1 == (int)ans.size()) {
  85. for (int j = 0; j < last - i; j++) {
  86. if (a[i + j] != ans[j]) {
  87. replace = a[i + j] < ans[j];
  88. break;
  89. }
  90. }
  91. }
  92. if (replace) {
  93. ans = std::vector<int>(a.begin() + i, a.begin() + last + 1);
  94. }
  95. i++;
  96. }
  97. */
  98. for (auto item : ans) {
  99. cout << item + 1 << " ";
  100. }
  101.  
  102. return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement