paranid5

Прямоугольники (С++)

Jul 10th, 2020
434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. /*Прямоугольники
  2. Дана последовательность N прямоугольников различной ширины и высоты (wi,hi). Прямоугольники расположены, начиная с точки (0,0), вправо на оси OX вплотную друг за другом. Требуется найти M — площадь максимального прямоугольника (параллельного осям координат), который можно вырезать из этой фигуры.
  3.  
  4. Формат входных данных
  5.  
  6. В первой строке задано число N (1≤N≤105). Далее идут N строк. В каждой строке содержатся два числа: ширина и высота i-го прямоугольника (1<wi≤3⋅104, 0≤hi≤3⋅104).
  7.  
  8. Формат выходных данных
  9.  
  10. Выведите искомое число M.
  11.  
  12. Примеры
  13. Ввод
  14. Вывод
  15.  
  16. 3
  17. 4 3
  18. 2 1
  19. 2 5
  20.  
  21. 12
  22.  
  23.  
  24. 3
  25. 4 3
  26. 2 1
  27. 3 5
  28.  
  29. 15
  30. */
  31.  
  32.  
  33. #include <cstdio>
  34. #include <vector>
  35. #include <stack>
  36.  
  37. typedef long long ll;
  38.  
  39. int main()
  40. {
  41.     int n = 0;
  42.     std::scanf("%d", &n);
  43.     std::vector<std::pair<int, int>>pn(n + 2);
  44.     pn[0].first = pn[n + 1].first = -1;
  45.     pn[0].second = pn[n + 1].second = 0;
  46.     for (int i = 1; i <= n; i++)
  47.         std::scanf("%d%d", &pn[i].second, &pn[i].first);
  48.     std::vector<int>ans_r(n);
  49.     std::stack<int>st_r;
  50.     st_r.push(0);
  51.     for (int i = 1; i <= n + 1; i++)
  52.     {
  53.         if (pn[i].first >= pn[st_r.top()].first)
  54.             st_r.push(i);
  55.         else
  56.         {
  57.             while (pn[i].first < pn[st_r.top()].first)
  58.             {
  59.                 ans_r[st_r.top() - 1] = i == n + 1 ? n : i - 1;
  60.                 st_r.pop();
  61.             }
  62.             st_r.push(i);
  63.         }
  64.     }
  65.     std::vector<int>ans_l(n);
  66.     std::stack<int>st_l;
  67.     st_l.push(n + 1);
  68.     for (int i = n; i >= 0; i--)
  69.     {
  70.         if (pn[i].first >= pn[st_l.top()].first)
  71.             st_l.push(i);
  72.         else
  73.         {
  74.             while (pn[i].first < pn[st_l.top()].first)
  75.             {
  76.                 ans_l[(st_l.top() - 1)] = i == 0 ? -1 : i - 1;
  77.                 st_l.pop();
  78.             }
  79.             st_l.push(i);
  80.         }
  81.     }
  82.     ll max_s = 0;
  83.     std::vector<ll>ph(n + 1);
  84.     ph[0] = 0;
  85.     for (int i = 1; i < n + 1; i++)
  86.         ph[i] = pn[i].second + ph[i - 1];
  87.     for (int i = 0; i < n; i++)
  88.     {
  89.         const ll s = pn[i + 1].first * (ph[ans_r[i]] - ph[ans_l[i] + 1]);
  90.         if (s > max_s) max_s = s;
  91.     }
  92.     std::printf("%lld", max_s);
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment