paranid5

Заклинания

Aug 30th, 2020 (edited)
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 11.51 KB | None | 0 0
  1. /*
  2. E. Два типа заклинаний
  3. ограничение по времени на тест 3.5 секунд
  4. ограничение по памяти на тест 256 мегабайт
  5. ввод стандартный ввод
  6. вывод стандартный вывод
  7. Поликарп играет в компьютерную игру (да, опять). В этой игре он сражается с монстрами при помощи заклинаний.
  8.  
  9. Есть два типа заклинаний: огненный шар силы x наносит x урона монстру, а молния силы y наносит y урона монстру и удваивает урон следующего заклинания. Каждое заклинание может быть использовано только один раз, но Поликарп может применять их в любом порядке.
  10.  
  11. Например, предположим, что Поликарп знает три заклинания: огненный шар силы 5, молнию силы 1 и молнию силы 8. Всего есть 6 способов выбрать порядок заклинаний:
  12.  
  13. первое, второе, третье. В таком случае вы нанесете 5+1+2⋅8=22 урона;
  14. первое, третье, второе. В таком случае вы нанесете 5+8+2⋅1=15 урона;
  15. второе, первое, третье. В таком случае вы нанесете 1+2⋅5+8=19 урона;
  16. второе, третье, первое. В таком случае вы нанесете 1+2⋅8+2⋅5=27 урона;
  17. третье, первое, второе. В таком случае вы нанесете 8+2⋅5+1=19 урона;
  18. третье, второе, первое. В таком случае вы нанесете 8+2⋅1+2⋅5=20 урона.
  19. Изначально Поликарп знает 0 заклинаний. Его набор заклинаний меняется n раз, каждый раз он либо учит новое заклинание, либо забывает старое. После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний.
  20.  
  21. Входные данные
  22. Первая строка содержит целое число n (1≤n≤2⋅105) — количество заклинаний в наборе.
  23.  
  24. Каждая из следующих n строк содержит два числа tp и d (0≤tpi≤1; −109≤d≤109; di≠0) — описание изменений. Если tpi равно 0, Поликарп учит (или забывает) огненный шар, иначе он учит (или забывает) молнию.
  25.  
  26. Если di>0, то Поликарп учит заклинание силы di. Иначе, Поликарп забывает заклинание силы −di, и гарантируется, что он знал это заклинание до этого.
  27.  
  28. Гарантируется, что после каждого изменения все силы заклинаний различны (Поликарп не может знать одновременно два заклинания одинаковой силы).
  29.  
  30. Выходные данные
  31. После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний.
  32.  
  33. Пример
  34. входные данные
  35. 6
  36. 1 5
  37. 0 10
  38. 1 -5
  39. 0 5
  40. 1 11
  41. 0 -10
  42. выходные данные
  43. 5
  44. 25
  45. 10
  46. 15
  47. 36
  48. 21
  49. */
  50.  
  51. use std::io;
  52. use std::collections::BTreeSet;
  53. use std::cmp::Ordering;
  54.  
  55. fn main() {
  56.     let mut n = String::new();
  57.     io::stdin().read_line(&mut n).unwrap();
  58.     let n = n.trim().parse::<i32>().unwrap();
  59.    
  60.     let mut balls = BTreeSet::<i32>::new();
  61.     let mut light = BTreeSet::<i32>::new();
  62.     let mut max= BTreeSet::<(i32, u8)>::new();
  63.    
  64.    
  65.     for _i in 0..n {
  66.         let mut input = String::new();
  67.         io::stdin().read_line(&mut input).unwrap();
  68.        
  69.         let mut tup = input.split_whitespace();
  70.         let kind = tup.next().unwrap().parse::<u8>().unwrap();
  71.         let amount = tup.next().unwrap().parse::<i32>().unwrap();
  72.         let mut sum: u128 = 0;
  73.        
  74.         match kind {
  75.             0 => {
  76.                 if amount < 0 {
  77.                     if balls.contains(&(-amount)) {
  78.                         balls.remove(&(-amount));
  79.                     } else {
  80.                         max.remove(&((-amount), kind));
  81.                        
  82.                         if balls.is_empty() {
  83.                             if !light.len() > 1 {
  84.                                 let lightning = *light.iter().last().unwrap();
  85.                                 max.insert((lightning, 1));
  86.                                 light.remove(&lightning);
  87.                             }
  88.                         } else {
  89.                             if light.len() <= 1 {
  90.                                 let ball = *balls.iter().last().unwrap();
  91.                                 max.insert((ball, 0));
  92.                                 balls.remove(&ball);
  93.                             } else {
  94.                                 let ball = *balls.iter().last().unwrap();
  95.                                 let lightning = *light.iter().last().unwrap();
  96.                                
  97.                                 match ball.cmp(&lightning) {
  98.                                     Ordering::Greater => {
  99.                                         max.insert((ball, 0));
  100.                                         balls.remove(&ball);
  101.                                     }
  102.                                    
  103.                                     _ => {
  104.                                         max.insert((lightning, 1));
  105.                                         light.remove(&lightning);
  106.                                     }
  107.                                 }
  108.                             }
  109.                         }
  110.                     }
  111.                 } else {
  112.                     if max.is_empty() {
  113.                         match light.is_empty() {
  114.                             true => { balls.insert(amount); },
  115.                             false => {
  116.                                 if !balls.is_empty() {
  117.                                     let ball = *balls.iter().last().unwrap();
  118.    
  119.                                     if amount > ball {
  120.                                         max.insert((amount, kind));
  121.                                     } else {
  122.                                         balls.remove(&ball);
  123.                                         max.insert((ball, 0));
  124.                                         balls.insert(amount);
  125.                                     }
  126.                                 } else {
  127.                                     max.insert((amount, kind));
  128.                                 }
  129.                             }
  130.                         };
  131.                     } else {
  132.                         let lightning = *light.iter().last().unwrap();
  133.    
  134.                         if amount > ball {
  135.                             match amount.cmp(&lightning) {
  136.                                 Ordering::Greater => max.insert((amount, 1)),
  137.                                 _ => {
  138.                                     max.insert((lightning, 1));
  139.                                     light.remove(&lightning);
  140.                                     light.insert(amount)
  141.                                 }
  142.                             };
  143.                         } else {
  144.                             match ball.cmp(&lightning) {
  145.                                 Ordering::Greater => {
  146.                                     max.insert((ball, 0));
  147.                                     balls.remove(&ball);
  148.                                 }
  149.                                 _ => {
  150.                                     max.insert((lightning, 1));
  151.                                     light.remove(&lightning);
  152.                                 }
  153.                             }
  154.                             light.insert(amount);
  155.                         }
  156.                     }
  157.                 }
  158.             }
  159.            
  160.             _ => {
  161.                 if amount < 0 {
  162.                     if light.contains(&(-amount)) {
  163.                         light.remove(&(-amount));
  164.                        
  165.                         if !max.is_empty() {
  166.                             let add = *max.iter().next().unwrap();
  167.                             max.remove(&add);
  168.    
  169.                             match add.1 {
  170.                                 0 => balls.insert(add.0),
  171.                                 _ => light.insert(add.0)
  172.                             };
  173.                         }
  174.                     } else {
  175.                         max.remove(&((-amount), kind));
  176.                     }
  177.                 } else {
  178.                     if balls.is_empty() {
  179.                         light.insert(amount);
  180.                     } else {
  181.                         let ball = *balls.iter().last().unwrap();
  182.                        
  183.                         if light.is_empty() {
  184.                             if !balls.is_empty() {
  185.                                 let ball = *balls.iter().last().unwrap();
  186.                                 max.insert((ball, 0));
  187.                                 balls.remove(&ball);
  188.                             }
  189.                             light.insert(amount);
  190.                         } else {
  191.                             let lightning = *light.iter().last().unwrap();
  192.                            
  193.                             if amount > ball {
  194.                                 match amount.cmp(&lightning) {
  195.                                     Ordering::Greater => max.insert((amount, 1)),
  196.                                     _ => {
  197.                                         max.insert((lightning, 1));
  198.                                         light.remove(&lightning);
  199.                                         light.insert(amount)
  200.                                     }
  201.                                 };
  202.                             } else {
  203.                                 match ball.cmp(&lightning) {
  204.                                     Ordering::Greater => {
  205.                                         max.insert((ball, 0));
  206.                                         balls.remove(&ball);
  207.                                     }
  208.                                     _ => {
  209.                                         max.insert((lightning, 1));
  210.                                         light.remove(&lightning);
  211.                                     }
  212.                                 }
  213.                                 light.insert(amount);
  214.                             }
  215.                         }
  216.                     }
  217.                 }
  218.             }
  219.         }
  220.    
  221.         for elem in &max {
  222.             sum += (*elem).0 as u128 * 2;
  223.         }
  224.        
  225.         if light.is_empty() && !max.is_empty() {
  226.             sum -= (*max.iter().next().unwrap()).0 as u128;
  227.         }
  228.        
  229.         for elem in &light {
  230.             sum += *elem as u128;
  231.         }
  232.        
  233.         for elem in &balls {
  234.             sum += *elem as u128;
  235.         }
  236.    
  237.         println!("{}\nballs: {:?} light: {:?}, max: {:?}", sum, balls, light, max);
  238.     }
  239. }
Add Comment
Please, Sign In to add comment