Advertisement
Guest User

Untitled

a guest
Sep 20th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. /**
  2. * author : cr11htxuanson
  3. * created : 20.09.2018
  4. **/
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. const int MAX = 50005;
  10. const int N = 50050;
  11. int n;
  12. int A[N];
  13. int F[5][N];
  14. int T[5][4 * N];
  15. int dp[5][N];
  16.  
  17. void Input()
  18. {
  19. cin >> n;
  20. for (int i = 1; i <= n; i++) cin >> A[i];
  21. }
  22.  
  23. void Subtask2()
  24. {
  25. memset(F, -1, sizeof(F));
  26. for (int i = 1; i <= n; i++) F[1][i] = 1;
  27. for (int i = 2; i <= n; i++) {
  28. for (int j = 1; j < i; j++) {
  29. if (A[i] > A[j]) F[1][i] = max(F[1][i], F[1][j] + 1);
  30. }
  31. for (int j = 1; j < i; j++) {
  32. if (A[i] > A[j]) continue;
  33. if (F[1][j] >= 2) F[2][i] = max(F[2][i], F[1][j] + 1);
  34. if (F[2][j] != -1) F[2][i] = max(F[2][i], F[2][j] + 1);
  35. }
  36. for (int j = 1; j < i; j++) {
  37. if (A[i] < A[j]) continue;
  38. if (F[2][j] != -1) F[3][i] = max(F[3][i], F[2][j] + 1);
  39. if (F[3][j] != -1) F[3][i] = max(F[3][i], F[3][j] + 1);
  40. }
  41. for (int j = 1; j < i; j++) {
  42. if (A[i] > A[j]) continue;
  43. if (F[3][j] != -1) F[4][i] = max(F[4][i], F[3][j] + 1);
  44. if (F[4][j] != -1) F[4][i] = max(F[4][i], F[4][j] + 1);
  45. }
  46. }
  47. int ans = 0;
  48. for (int i = 1; i <= n; i++) ans = max(ans, F[4][i]);
  49. cout << ans;
  50. }
  51.  
  52. void Roirac()
  53. {
  54. map <int, int> Map;
  55. set <int> Set;
  56. set <int> :: iterator it;
  57. for (int i = 1; i <= n; i++) Set.insert(A[i]);
  58. int cnt = 0;
  59. for (it = Set.begin(); it != Set.end(); it++) {
  60. cnt++;
  61. int val = *it;
  62. Map[val] = cnt;
  63. }
  64. for (int i = 1; i <= n; i++) A[i] = Map[A[i]];
  65. }
  66.  
  67. void update(int id, int node, int l, int r, int ql, int qr, int val)
  68. {
  69. if (l > qr || r < ql) return;
  70. if (l >= ql && r <= qr) {
  71. T[id][node] = val;
  72. return;
  73. }
  74. int mid = (l + r) >> 1;
  75. update(id, node + node, l, mid, ql, qr, val);
  76. update(id, node + node + 1, mid + 1, r, ql, qr, val);
  77. T[id][node] = max(T[id][node + node], T[id][node + node + 1]);
  78. }
  79.  
  80. int get(int id, int node, int l, int r, int ql, int qr)
  81. {
  82. if (l > qr || r < ql) return 0;
  83. if (l >= ql && r <= qr) return T[id][node];
  84. int mid = (l + r) >> 1;
  85. int x = get(id, node + node, l, mid, ql, qr);
  86. int y = get(id, node + node + 1, mid + 1, r, ql, qr);
  87. return max(x, y);
  88. }
  89.  
  90. void Lastsub()
  91. {
  92. Roirac();
  93. memset(T, -1, sizeof(T));
  94. for (int i = 2; i <= n; i++) {
  95. int val_1 = get(1, 1, 1, n, 1, A[i] - 1);
  96. int val_2 = max(get(1, 1, 1, n, A[i] + 1, MAX), get(2, 1, 1, n, A[i] + 1, MAX));
  97. int val_3 = max(get(2, 1, 1, n, 1, A[i] - 1), get(3, 1, 1, n, 1, A[i] - 1));
  98. int val_4 = max(get(3, 1, 1, n, A[i] + 1, MAX), get(4, 1, 1, n, A[i] + 1, MAX));
  99. dp[1][i] = val_1 + 1;
  100. if (val_2 >= 2) dp[2][i] = val_2 + 1;
  101. if (val_3 >= 3) dp[3][i] = val_3 + 1;
  102. if (val_4 >= 4) dp[4][i] = val_4 + 1;
  103. update(1, 1, 1, n, A[i], A[i], dp[1][i]);
  104. update(2, 1, 1, n, A[i], A[i], dp[2][i]);
  105. update(3, 1, 1, n, A[i], A[i], dp[3][i]);
  106. update(4, 1, 1, n, A[i], A[i], dp[4][i]);
  107. }
  108. int ans = 0;
  109. for (int i = 1; i <= n; i++) ans = max(ans, dp[4][i]);
  110. cout << ans;
  111. }
  112.  
  113. void Output()
  114. {
  115. // /Subtask2();
  116. if (n <= 1000) {
  117. Subtask2();
  118. return;
  119. }
  120. Lastsub();
  121. }
  122.  
  123. int main()
  124. {
  125. ios :: sync_with_stdio(false);
  126. cin.tie(0); cout.tie(0);
  127.  
  128. // freopen ("M.inp", "r", stdin);
  129. // freopen ("M.out", "w", stdout);
  130.  
  131. Input(); Output();
  132.  
  133. return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement