Advertisement
paranid5

Поездка (Сириус 2019 2) Rust

Jul 11th, 2020
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.82 KB | None | 0 0
  1. /*В 2029 году три финала Всероссийской олимпиады — по химии, информатике и физкультуре — проводятся в Самаре. Из Саратова прошло много участников по каждому из этих предметов, и все они планируют ехать в Самару на поезде. Руководитель сборной по химии уже купил билеты для своих подопечных. Руководитель сборной по информатике как раз сейчас планирует этим заняться. Но программисты — странные люди, у которых есть много запросов к купленным местам. Например, они категорически не хотят ехать в одном вагоне со спортсменами (участниками сборной по физкультуре), а также со всеми другими людьми, не прошедшими на всерос (то есть, из всех возможных людей, они готовы терпеть только всероссников по химии).
  2.  
  3. К счастью, пока кроме химиков ещё никто не успел купить билеты на поезд, так что всё, что нужно обеспечить руководителю, это чтобы после покупки билетов, в вагонах, в которых поедут участники сборной по информатике не осталось свободных мест (тогда там точно не поедут посторонние).
  4.  
  5. Но у руководителя есть и свои ограничения — он хочет, чтобы вагонов, в которых поедут его подопечные, было как можно меньше и они шли подряд (при этом допускается, чтобы между ними были целиком занятые вагоны).
  6.  
  7. Помогите руководителю сборной выбрать, в каких вагонах информатики поедут на олимпиаду, или определите, что это невозможно.
  8.  
  9. Входные данные
  10. В первой строке дано два целых числа n и k (1≤n≤105,1≤k≤109) — число вагонов и участников сборной соответственно.
  11.  
  12. Во второй строке даны n целых чисел ai (0≤ai≤109) — количество свободных мест в вагонах.
  13.  
  14. Гарантируется, что суммарное число свободных мест в поезде не превосходит 109.
  15.  
  16. Выходные данные
  17. Выведите два целых числа — номера первого и последнего вагона, в которых поедут участники сборной.
  18.  
  19. Если же купить билеты, соблюдая все требования, невозможно, выведите -1.
  20.  
  21. Система оценки
  22.  
  23.  
  24. Примеры
  25. входные данные
  26. 7 5
  27. 1 2 3 4 2 1 2
  28. выходные данные
  29. 2 3
  30. входные данные
  31. 5 3
  32. 1 0 2 10 10
  33. выходные данные
  34. 1 3
  35. */
  36.  
  37.  
  38. use std::collections::VecDeque;
  39. use std::io;
  40. use std::str::SplitWhitespace;
  41.  
  42. fn main() {
  43.     let mut amount: String = String::new();
  44.     io::stdin().read_line(&mut amount).unwrap();
  45.  
  46.     let mut it_am: SplitWhitespace = amount.split_whitespace();
  47.     let n: usize = it_am.next().unwrap().parse().unwrap();
  48.     let k: u32 = it_am.next().unwrap().parse().unwrap();
  49.  
  50.     let mut pn_s: String = String::new();
  51.     io::stdin().read_line(&mut pn_s).unwrap();
  52.  
  53.     let mut pn: Vec<u32> = Vec::with_capacity(n);
  54.  
  55.     let mut it_pns: SplitWhitespace = pn_s.split_whitespace();
  56.  
  57.     let mut c = 0;
  58.     loop {
  59.         pn.push(it_pns.next().unwrap().parse().unwrap());
  60.         c += 1;
  61.         if c == n {
  62.             break;
  63.         }
  64.     }
  65.  
  66.     let mut sum: u32 = 0;
  67.     let mut que: VecDeque<usize> = VecDeque::new();
  68.     let mut ptr: usize = 0;
  69.  
  70.     let mut best_s: usize = 0;
  71.     let mut best_f: usize = 0;
  72.     let mut best_l = std::usize::MAX;
  73.  
  74.     loop {
  75.         if sum < k {
  76.             unsafe {
  77.                 sum += *pn.get_unchecked(ptr);
  78.             }
  79.             que.push_back(ptr);
  80.             ptr += 1;
  81.         } else if sum > k {
  82.             unsafe {
  83.                 sum -= *pn.get_unchecked(*que.front().unwrap());
  84.             }
  85.             que.pop_front();
  86.         } else {
  87.             if *que.back().unwrap() - *que.front().unwrap() < best_l {
  88.                 best_l = *que.back().unwrap() - *que.front().unwrap();
  89.                 best_s = *que.front().unwrap();
  90.                 best_f = *que.back().unwrap();
  91.             }
  92.  
  93.             unsafe {
  94.                 sum -= *pn.get_unchecked(*que.front().unwrap());
  95.             }
  96.             que.pop_front();
  97.         }
  98.         if ptr >= pn.len() {
  99.             break;
  100.         }
  101.     }
  102.  
  103.     if sum > k {
  104.         loop {
  105.             unsafe {
  106.                 sum -= *pn.get_unchecked(*que.front().unwrap());
  107.             }
  108.             que.pop_front();
  109.  
  110.             if sum <= k {
  111.                 break;
  112.             }
  113.         }
  114.     }
  115.  
  116.     if sum == k {
  117.         if *que.back().unwrap() - *que.front().unwrap() < best_l {
  118.             best_l = *que.back().unwrap() - *que.front().unwrap();
  119.             best_s = *que.front().unwrap();
  120.             best_f = *que.back().unwrap();
  121.         }
  122.     }
  123.  
  124.     if best_l != n + 1 {
  125.         print!("{} {}", best_s + 1, best_f + 1);
  126.     } else {
  127.         print!("-1");
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement