ProgMe

Untitled

Jan 20th, 2021
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int int64_t
  3.  
  4. using namespace std;
  5.  
  6. const int N = 2e5;
  7. int n;
  8. int h[N];
  9. int tree[400004]; //дерево отрезков. в вершинах хранятся минимумы
  10.  
  11. void build_tree(int v, int tl, int tr) {
  12. if (tl == tr) {
  13. tree[v] = h[tl];
  14. } else {
  15. int tm = (tl + tr) / 2;
  16. build_tree(v * 2, tl, tm);
  17. build_tree(v * 2 + 1, tm + 1, tr);
  18. tree[v] = min(tree[v * 2], tree[v * 2 + 1]); //сохраняем минимум вместо суммы
  19. }
  20. }
  21.  
  22. //Запрос минимума
  23. int get_min(int l, int r, int v, int tl, int tr) {
  24. //вариант 1
  25. if (l <= tl && tr <= r) {
  26. return tree[v];
  27. }
  28.  
  29. //вариант 2
  30. if (tr < l || r < tl) {
  31. return INT_MAX; //Значение, которое не повлияет на общий минимум
  32. }
  33.  
  34. //вариант 3
  35. int tm = (tl + tr) / 2;
  36. return min(get_min(l, r, v * 2, tl, tm), //минимум вместо суммы.
  37. get_min(l, r, v * 2 + 1, tm + 1, tr));
  38. }
  39.  
  40. int f(int idx){
  41. int r_l = 0, r_r = n - 1;
  42. int l = 0, r = idx - 1;
  43. if(l < r && get_min(l, r, 1, 0, n - 1) < h[idx]){
  44. while(l < r){
  45. int m = (l + r) / 2;
  46. if(get_min(m + 1, r, 1, 0, n - 1) < h[idx])
  47. l = m + 1;
  48. else
  49. r = m;
  50. }
  51. r_l = l;
  52. }
  53. l = idx + 1, r = n - 1;
  54. if(l < r && get_min(l, r, 1, 0, n - 1) < h[idx]){
  55. while(l < r){
  56. int m = (l + r) / 2;
  57. if(get_min(l, m, 1, 0, n - 1) < h[idx])
  58. r = m;
  59. else
  60. l = m + 1;
  61. }
  62. r_r = l;
  63. }
  64. if(h[r_r] < h[idx])
  65. r_r--;
  66. if(h[r_l] < h[idx])
  67. r_l++;
  68. return r_r - r_l + 1;
  69. }
  70.  
  71. int32_t main() {
  72. cin >> n;
  73. for (int i = 0; i < n; ++i)
  74. cin >> h[i];
  75. build_tree(1, 0, n - 1);
  76. int mn_w = LLONG_MAX, mn_h = LLONG_MAX;
  77. for(int i = 0; i < n; i++){
  78. if(h[i] == 0)
  79. continue;
  80. int cur_h = h[i];
  81. int cur_w = f(i);
  82. if(cur_h > cur_w)
  83. swap(cur_h, cur_w);
  84. mn_h = min(mn_h, cur_h);
  85. mn_w = min(mn_w, cur_w);
  86. }
  87. cout << mn_h * mn_w;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment