Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. // :pray: :fishy:
  2.  
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <utility>
  8. #include <map>
  9. #include <queue>
  10. #include <set>
  11. #include <cmath>
  12. #include <assert.h>
  13.  
  14. #define ll long long
  15. #define eps 1e-8
  16. #define MOD 1000000007
  17.  
  18. #define INF 0x3f3f3f3f
  19. #define INFLL 0x3f3f3f3f3f3f3f3f
  20.  
  21. // change if necessary
  22. #define MAXN 2000
  23.  
  24. using namespace std;
  25.  
  26. int n;
  27. int nums[MAXN];
  28. int sec_last[MAXN];
  29. int last[MAXN];
  30. int sec[MAXN];
  31. int first[MAXN];
  32. pair<int, int> dp[MAXN][2];
  33.  
  34. map<int, int> pos;
  35. map<int, int> cnt;
  36.  
  37. int main() {
  38. cin.tie(0); ios::sync_with_stdio(0);
  39.  
  40. cin >> n;
  41. for (int i = 0; i < n; i++) {
  42. cin >> nums[i];
  43. if (cnt.count(nums[i])) {
  44. cnt[nums[i]]++;
  45. } else {
  46. cnt[nums[i]] = 1;
  47. }
  48. }
  49.  
  50. for (int i = 0; i < n; i++) {
  51. last[i] = -1;
  52. sec_last[i] = -1;
  53. first[i] = -1;
  54. sec[i] = -1;
  55. for (int j = i + 1; j < n; j++) {
  56. if (nums[i] == nums[j]) {
  57. sec_last[i] = last[i];
  58. last[i] = j;
  59. }
  60. }
  61.  
  62. for (int j = i - 1; j >= 0; j--) {
  63. if (nums[i] == nums[j]) {
  64. sec[i] = first[i];
  65. first[i] = j;
  66. }
  67. }
  68. }
  69.  
  70. vector<vector<vector<int>>> seq(n);
  71. set<int> top_done;
  72. set<int> bottom_done;
  73. for (int i = 0; i < n; i++) {
  74. if (cnt[nums[i]] > 1 && !top_done.count(nums[i])) {
  75. top_done.insert(nums[i]);
  76. int p = (int)(pos.size());
  77. pos[nums[i]] = p;
  78. seq[pos[nums[i]]] = {{-1, -1, -1}, {INF, INF, INF}};
  79. if (sec_last[i] == -1) {
  80. seq[pos[nums[i]]][0] = {nums[i], i, i};
  81. } else {
  82. seq[pos[nums[i]]][0] = {nums[i], i, sec_last[i]};
  83. }
  84. }
  85. }
  86.  
  87. for (int i = n - 1; i >= 0; i--) {
  88. if (cnt[nums[i]] > 1 && !bottom_done.count(nums[i])) {
  89. bottom_done.insert(nums[i]);
  90. //assert(pos[nums[i]] < pos.size());
  91. if (sec[i] == -1) {
  92. seq[pos[nums[i]]][1] = {nums[i], i, i};
  93. } else {
  94. seq[pos[nums[i]]][1] = {nums[i], sec[i], i};
  95. }
  96. }
  97. }
  98.  
  99. if (pos.size() == 0) {
  100. cout << 0 << '\n';
  101. return 0;
  102. }
  103.  
  104. dp[0][0] = {seq[0][0][1], seq[0][0][2]};
  105. dp[0][1] = {seq[0][1][1], seq[0][1][2]};
  106.  
  107. int p = (int)(pos.size());
  108. for (int i = 1; i < p; i++) {
  109. for (int j = 0; j < 2; j++) {
  110. int l1 = min(dp[i - 1][0].first, seq[i][j][1]);
  111. int l2 = min(dp[i - 1][1].first, seq[i][j][1]);
  112. int r1 = max(dp[i - 1][0].second, seq[i][j][2]);
  113. int r2 = max(dp[i - 1][1].second, seq[i][j][2]);
  114. if (r2 - l2 > r1 - l1) {
  115. dp[i][j] = {l1, r1};
  116. } else {
  117. dp[i][j] = {l2, r2};
  118. }
  119. }
  120. //cout << dp[i][1].first << ' ' << dp[i][1].second << '\n';
  121. }
  122.  
  123. if (dp[p - 1][0].second - dp[p - 1][0].first < dp[p - 1][1].second - dp[p - 1][1].first) {
  124. cout << dp[p - 1][0].second - dp[p - 1][0].first + 1 << '\n';
  125. } else {
  126. cout << dp[p - 1][1].second - dp[p - 1][1].first + 1 << '\n';
  127. }
  128.  
  129. return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement