Advertisement
Guest User

u303-i

a guest
Dec 6th, 2015
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <string>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <utility>
  13. #include <queue>
  14. #include <stack>
  15.  
  16. using namespace std;
  17.  
  18. #define filename "improvements"
  19.  
  20. const int MAXN = 2 * 105000;
  21. const int INF = (int) 1e9;
  22.  
  23. int n;
  24. int a[MAXN], p[MAXN];
  25. int up[MAXN], down[MAXN];
  26. int tree[4 * MAXN];
  27. int num;
  28.  
  29. int getmax(int l, int r) {
  30. l = num + l - 1; r = num + r - 1;
  31. int res = 0;
  32. while (l <= r) {
  33. if (l & 1) {
  34. if (tree[l] > res)
  35. res = tree[l];
  36. l++;
  37. }
  38. if (r % 2 == 0) {
  39. if (tree[r] > res)
  40. res = tree[r];
  41. r--;
  42. }
  43. l /= 2; r /= 2;
  44. }
  45. return res;
  46. }
  47.  
  48. void update(int pos, int val) {
  49. pos = num + pos - 1;
  50. tree[pos] = val;
  51. pos /= 2;
  52. while (pos >= 1) {
  53. tree[pos] = max(tree[pos * 2], tree[pos * 2 + 1]);
  54. pos /= 2;
  55. }
  56. }
  57.  
  58. int main() {
  59. assert(freopen(filename ".in", "r", stdin));
  60. assert(freopen(filename ".out", "w", stdout));
  61.  
  62. scanf("%d", &n);
  63.  
  64. for (int i = 1; i <= n; i++) {
  65. scanf("%d", &a[i]);
  66. p[a[i]] = i;
  67. }
  68.  
  69. /*for (int i = 1; i <= n; i++)
  70. printf("%d ", p[i]);
  71. cout << endl; */
  72.  
  73.  
  74. num = 1;
  75. while (num <= n)
  76. num *= 2;
  77.  
  78. for (int i = 1; i < 2 * num; i++)
  79. tree[i] = 0;
  80.  
  81. for (int i = 1; i <= n; i++) {
  82. int cur = p[i];
  83. int curans = 1 + getmax(1, cur - 1);
  84. up[i] = max(up[i - 1], curans);
  85. update(cur, curans);
  86. }
  87.  
  88. memset(tree, 0, sizeof(tree));
  89.  
  90. for (int i = n; i >= 1; i--) {
  91. int cur = p[i];
  92. int curans = 1 + getmax(1, cur - 1);
  93. down[i] = max(down[i + 1], curans);
  94. update(cur, curans);
  95. }
  96.  
  97. int ans = min(up[n], down[1]);
  98. for (int i = 1; i < n; i++) {
  99. ans = max(ans, up[i] + down[i + 1]);
  100. }
  101.  
  102. cout << ans << endl;
  103.  
  104. return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement