paranid5

Прямоугольники

Jul 10th, 2020
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.59 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.  
  34. // stack.rs
  35.  
  36. pub mod stack {
  37.    
  38.     /*#-#-#-#-#-#-Реализация стека-#-#-#-#-#-#-#*/
  39.    
  40.     #[derive(Clone, PartialEq, Debug)]
  41.     pub struct Stack<T> {
  42.         container: Vec<T>,
  43.     }
  44.    
  45.     impl<T> Stack<T> {
  46.        
  47.         // Создаём новый стек
  48.        
  49.         pub fn new() -> Self {
  50.             Stack { container: vec![] }
  51.         }
  52.        
  53.         // Добавление элемента
  54.         // в конец стека
  55.        
  56.         pub fn push(&mut self, value: T) {
  57.             self.container.push(value);
  58.         }
  59.        
  60.         // Удаление элемента из стека
  61.         // В случае успеха возвращает ссылку
  62.         // на удалённый элемент
  63.         // иначе None
  64.        
  65.         pub fn pop(&mut self) {
  66.             self.container.pop();
  67.         }
  68.        
  69.         // Очистка стека
  70.        
  71.         pub fn clear(&mut self) {
  72.             self.container.clear();
  73.         }
  74.        
  75.         // Функция возвращает указатель
  76.         // на последний элемент стека
  77.        
  78.         pub fn top(&mut self) -> Option<&T> {
  79.             return self.container.last()
  80.         }
  81.        
  82.         // функция проверки стека на пустоту
  83.        
  84.         pub fn is_empty(&self) -> bool {
  85.             self.container.is_empty()
  86.         }
  87.     }
  88. }
  89.  
  90.  
  91. // main.rs
  92.  
  93. mod stack;
  94. use std::io;
  95. use crate::stack::stack::Stack;
  96.  
  97. fn main() {
  98.     // Считываем кол-во данных
  99.     let mut n = String::new();
  100.     io::stdin().read_line(&mut n).unwrap();
  101.     let n: usize = n.trim().parse().unwrap();
  102.    
  103.     // Заводим вектор под данные
  104.     let mut pn = Vec::with_capacity(n + 2);
  105.     pn.resize(n + 2, (0, 0));
  106.    
  107.     // Считываем данные
  108.     for i in 1..n + 1 {
  109.         let mut elem = String::new();
  110.         io::stdin().read_line(&mut elem).unwrap();
  111.        
  112.         let mut it_elem = elem.split_whitespace();
  113.         pn[i].1 = it_elem.next().unwrap().parse().unwrap();
  114.         pn[i].0 = it_elem.next().unwrap().parse().unwrap();
  115.     }
  116.    
  117.     // Вектор, хранящий индекс ближайшего элемента
  118.     // справа, меньше текущего
  119.     let mut ans_r = Vec::with_capacity(n);
  120.     ans_r.resize(n, 0);
  121.    
  122.     // Храним всё в стеке. Когда встречаем
  123.     // элемент, меньше нашего, то пишем ответы,
  124.     // удаляем элементы из стека, которые
  125.     // больше текущего, а затем добавляем в стек
  126.    
  127.     let mut st_r = Stack::new();
  128.     st_r.push(0);
  129.    
  130.     //Делаем всё вышесказанное
  131.    
  132.     for i in 1..n + 2 {
  133.        
  134.         if pn[i].0 >= pn[*st_r.top().unwrap()].0 {
  135.             st_r.push(i);
  136.            
  137.         } else {
  138.            
  139.             while pn[i].0 < pn[*st_r.top().unwrap() as usize].0 {
  140.                 ans_r[*st_r.top().unwrap() as usize - 1] = if i == n + 1 { n } else { i - 1 };
  141.                 st_r.pop();
  142.             }
  143.            
  144.             st_r.push(i);
  145.         }
  146.     }
  147.    
  148.     // Делаем всё тоже, но уже идём влево
  149.    
  150.     let mut ans_l: Vec<i32> = Vec::with_capacity(n);
  151.     ans_l.resize(n, 0);
  152.    
  153.     let mut st_l: Stack<i32> = Stack::new();
  154.     st_l.push(n as i32 + 1);
  155.    
  156.     // for заменить на while оказалось проще
  157.     // нежели долбаться с for-ом
  158.    
  159.     let mut g = n as i32;
  160.     while g >= 0 {
  161.         if pn[g as usize].0 >= pn[*st_l.top().unwrap() as usize].0 {
  162.             st_l.push(g);
  163.         } else {
  164.    
  165.             while pn[g as usize].0 < pn[*st_l.top().unwrap() as usize].0 {
  166.                 ans_l[*st_l.top().unwrap() as usize - 1] = if g == 0 { -1 } else { g - 1 };
  167.                 st_l.pop();
  168.             }
  169.            
  170.             st_l.push(g);
  171.         }
  172.         g -= 1;
  173.     }
  174.    
  175.     // Находим максимальную площадь
  176.    
  177.     let mut max_s = 0;
  178.    
  179.     // Заранее посчитаем всю ширину с помощью
  180.     // массива префиксных сумм
  181.     // чтобы не считать каждый раз в цикле
  182.    
  183.     let mut ph = Vec::with_capacity(n + 1);
  184.     ph.resize(n + 1, 0_usize);
  185.    
  186.     for i in 1..n + 1 {
  187.         ph[i] = pn[i].1 + ph[i - 1];
  188.     }
  189.    
  190.     // Находим наибольшую площадь
  191.    
  192.     for i in 0..n {
  193.         let s = (pn[i + 1].0) as i128 * ((ph[ans_r[i]]) as i128 - (ph[(ans_l[i] + 1) as usize]) as i128);
  194.         max_s = if s > max_s  { s } else { max_s };
  195.     }
  196.    
  197.     print!("{}", max_s);
  198. }
Advertisement
Add Comment
Please, Sign In to add comment