paranid5

E

Jul 14th, 2020 (edited)
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.21 KB | None | 0 0
  1. /*
  2. Для пассажиров кольцевой железнодорожной линии, построенной в столице Байтландии, существует следующая система абонементных билетов. Заплатив ai байтландских тугриков, пассажир получает право проезда от станции 0 до станции i (и только до неё). Таким образом, право проезда на две станции i и j даёт абонементный билет стоимостью ai+aj. Так как, кроме станции 0, на кольцевой линии находятся ещё n станций, то всего существует 2^n различных абонементов (включая и бесплатный абонемент со станции 0 до самой себя), отличающиеся множеством станций, до которых они дают проезд.
  3.  
  4. Вам дана стоимость каждого из 2n абонементов. Требуется восстановить ai или сообщить, что при передаче списка стоимостей абонементов произошла ошибка и ни при каких ai указанные стоимости не могут быть сформированы.
  5.  
  6. Формат ввода
  7. Первая строка содержит одно целое число n (1 ≤ N ≤ 18) — количество станций (кроме станции 0), находящихся на линии. Каждая их последующих 2n строк содержит одно целое число — стоимость очередного абонемента (0 ≤ p ≤ 228).
  8.  
  9. Формат вывода
  10. Выведите n целых чисел в неубывающем порядке — значения ai. Если вариантов несколько, выведите любой.
  11.  
  12. Если решения нет, выведите текст “impossible”.
  13. */
  14.  
  15. use std::io;
  16.  
  17. fn main() {
  18.     let mut pn: Vec<u32> = Vec::with_capacity(229);
  19.     for _i in 0..229 {
  20.         pn.push(0);
  21.     }
  22.  
  23.     let mut n: String = String::new();
  24.     io::stdin().read_line(&mut n).unwrap();
  25.     let n: u32 = n.trim().parse().unwrap();
  26.  
  27.     let mut max: i32 = -1;
  28.     for _i in 0..2_u32.pow(n) {
  29.         let mut x: String = String::new();
  30.         io::stdin().read_line(&mut x).unwrap();
  31.         let x: usize = x.trim().parse().unwrap();
  32.         if x as i32 > max {
  33.             max = x as i32;
  34.         }
  35.         unsafe {
  36.             *pn.get_unchecked_mut(x) += 1;
  37.         }
  38.     }
  39.  
  40.     for _i in max as usize + 1..pn.len() {
  41.         pn.remove(max as usize + 1);
  42.     }
  43.  
  44.     let mut correct: bool = true;
  45.     unsafe {
  46.         if *pn.get_unchecked(0) == 0 {
  47.             correct = false;
  48.         } else {
  49.             *pn.get_unchecked_mut(0) -= 1;
  50.         }
  51.     }
  52.  
  53.     if n == 1 {
  54.         if !correct {
  55.             print!("impossible");
  56.         } else {
  57.             unsafe {
  58.                 for i in 0..pn.len() {
  59.                     if *pn.get_unchecked(i) > 0 {
  60.                         print!("{}", i);
  61.                         break;
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     } else {
  67.         if correct {
  68.             let mut ans: Vec<u32> = Vec::with_capacity(n as usize);
  69.             let mut sums: Vec<u32> = Vec::with_capacity(2_usize.pow(n));
  70.  
  71.             let mut ptr: usize = 0;
  72.             let mut v1: u32 = 0;
  73.             let mut v2: u32 = 0;
  74.  
  75.             unsafe {
  76.                 while *pn.get_unchecked(ptr) == 0 {
  77.                     ptr += 1;
  78.                 }
  79.                 v1 = ptr as u32;
  80.                 *pn.get_unchecked_mut(ptr) -= 1;
  81.                 while *pn.get_unchecked(ptr) == 0 {
  82.                     ptr += 1;
  83.                 }
  84.                 v2 = ptr as u32;
  85.                 *pn.get_unchecked_mut(ptr) -= 1;
  86.             }
  87.  
  88.             ans.push(v1);
  89.             ans.push(v2);
  90.  
  91.             sums.push(v1 + v2);
  92.             sums.push(v1);
  93.             sums.push(v2);
  94.             unsafe {
  95.                 if v1 + v2 >= pn.len() as u32 || *pn.get_unchecked(v1 as usize + v2 as usize) == 0 {
  96.                     correct = false;
  97.                 } else {
  98.                     *pn.get_unchecked_mut(v1 as usize + v2 as usize) -= 1;
  99.                 }
  100.             }
  101.  
  102.             if correct {
  103.                 for i in ptr..pn.len() {
  104.                     if !correct {
  105.                         break;
  106.                     }
  107.                     unsafe {
  108.                         if *pn.get_unchecked(i) > 0 {
  109.                             while *pn.get_unchecked(i) > 0 {
  110.                                 for q in 0..sums.len() {
  111.                                     let b: u32;
  112.                                     {
  113.                                         b = *sums.get_unchecked(q);
  114.                                     }
  115.                                     sums.push(b + i as u32);
  116.                                     if b as usize + i >= pn.len()
  117.                                         || *pn.get_unchecked_mut(b as usize + i) == 0
  118.                                     {
  119.                                         correct = false;
  120.                                         break;
  121.                                     } else {
  122.                                         *pn.get_unchecked_mut(b as usize + i) -= 1;
  123.                                     }
  124.                                 }
  125.                                 if correct {
  126.                                     *pn.get_unchecked_mut(i) -= 1;
  127.                                     ans.push(i as u32);
  128.                                     sums.push(i as u32);
  129.                                 } else {
  130.                                     break;
  131.                                 }
  132.                             }
  133.                         }
  134.                     }
  135.                 }
  136.             }
  137.             drop(pn);
  138.             drop(sums);
  139.  
  140.             for i in ans {
  141.                 println!("{}", i);
  142.             }
  143.         } else {
  144.             println!("impossible");
  145.         }
  146.     }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment