Advertisement
paranid5

CF_stupid

Nov 15th, 2020
524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.95 KB | None | 0 0
  1. use std::fmt::Debug;
  2. use std::io;
  3. use std::num::ParseIntError;
  4. use std::str::FromStr;
  5.  
  6. #[inline]
  7. fn input<T: FromStr<Err = ParseIntError> + Debug>() -> T {
  8.     let mut input = String::new();
  9.     io::stdin().read_line(&mut input).unwrap();
  10.     input.trim().parse().unwrap()
  11. }
  12.  
  13. #[inline]
  14. fn input_vec<T: FromStr<Err = ParseIntError> + Debug>() -> Vec<T> {
  15.     let mut input = String::new();
  16.     io::stdin().read_line(&mut input).unwrap();
  17.     input
  18.         .split_ascii_whitespace()
  19.         .map(|x| x.parse::<T>().unwrap())
  20.         .collect()
  21. }
  22.  
  23. #[inline]
  24. fn input_pair<T: FromStr<Err = ParseIntError> + Debug>() -> (T, T) {
  25.     let mut input = String::new();
  26.     io::stdin().read_line(&mut input).unwrap();
  27.  
  28.     let mut input = input.split_ascii_whitespace();
  29.     (
  30.         input.next().unwrap().parse().unwrap(),
  31.         input.next().unwrap().parse().unwrap(),
  32.     )
  33. }
  34.  
  35. #[inline]
  36. fn remake(i: usize, q: usize, i_: usize, q_: usize, vec: &mut Vec<Vec<i32>>) {
  37.     unsafe {
  38.         *vec.get_unchecked_mut(i).get_unchecked_mut(q) = -*vec.get_unchecked(i).get_unchecked(q);
  39.         *vec.get_unchecked_mut(i_).get_unchecked_mut(q_) =
  40.             -*vec.get_unchecked(i_).get_unchecked(q_);
  41.     }
  42. }
  43.  
  44. fn change(
  45.     i: usize,
  46.     q: usize,
  47.     n: usize,
  48.     m: usize,
  49.     vec: &mut Vec<Vec<i32>>,
  50.     map: &mut Vec<(i32, usize, usize)>,
  51. ) -> bool {
  52.     unsafe {
  53.         if *vec.get_unchecked(i).get_unchecked(q) < 0 {
  54.             if i > 0 {
  55.                 remake(i, q, i - 1, q, vec);
  56.                 return true;
  57.             }
  58.  
  59.             if i + 1 < n {
  60.                 if *vec.get_unchecked(i + 1).get_unchecked(q) <= 0 {
  61.                     remake(i, q, i + 1, q, vec);
  62.                     return true;
  63.                 }
  64.             }
  65.  
  66.             if q > 0 {
  67.                 if *vec.get_unchecked(i).get_unchecked(q - 1) <= 0 {
  68.                     remake(i, q, i, q - 1, vec);
  69.                     return true;
  70.                 }
  71.             }
  72.  
  73.             if q + 1 < m {
  74.                 if *vec.get_unchecked(i).get_unchecked(q + 1) <= 0 {
  75.                     remake(i, q, i, q + 1, vec);
  76.                     return true;
  77.                 }
  78.             }
  79.  
  80.             let mut min = Vec::with_capacity(4);
  81.  
  82.             if i > 0 {
  83.                 min.push(*vec.get_unchecked(i - 1).get_unchecked(q));
  84.             }
  85.  
  86.             if i + 1 < n {
  87.                 min.push(*vec.get_unchecked(i + 1).get_unchecked(q));
  88.             }
  89.  
  90.             if q > 0 {
  91.                 min.push(*vec.get_unchecked(i).get_unchecked(q - 1));
  92.             }
  93.  
  94.             if q + 1 < m {
  95.                 min.push(*vec.get_unchecked(i).get_unchecked(q + 1));
  96.             }
  97.  
  98.             min.sort();
  99.  
  100.             let x = *min.get_unchecked(0);
  101.  
  102.             if (*vec.get_unchecked_mut(i).get_unchecked_mut(q)).abs() > x {
  103.                 if i > 0 {
  104.                     if *vec.get_unchecked(i - 1).get_unchecked(q) == x {
  105.                         remake(i, q, i - 1, q, vec);
  106.                         map.push((*vec.get_unchecked(i - 1).get_unchecked(q), i - 1, q));
  107.                         map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
  108.                         return true;
  109.                     }
  110.                 }
  111.  
  112.                 if i + 1 < n {
  113.                     if *vec.get_unchecked(i + 1).get_unchecked(q) == x {
  114.                         remake(i, q, i + 1, q, vec);
  115.                         map.push((*vec.get_unchecked(i + 1).get_unchecked(q), i + 1, q));
  116.                         map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
  117.                         return true;
  118.                     }
  119.                 }
  120.  
  121.                 if q > 0 {
  122.                     if *vec.get_unchecked(i).get_unchecked(q - 1) == x {
  123.                         remake(i, q, i, q - 1, vec);
  124.                         map.push((*vec.get_unchecked(i).get_unchecked(q - 1), i, q - 1));
  125.                         map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
  126.                         return true;
  127.                     }
  128.                 }
  129.  
  130.                 if q + 1 < m {
  131.                     if *vec.get_unchecked(i).get_unchecked(q + 1) == x {
  132.                         remake(i, q, i, q + 1, vec);
  133.                         map.push((*vec.get_unchecked(i).get_unchecked(q + 1), i, q + 1));
  134.                         map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
  135.                         return true;
  136.                     }
  137.                 }
  138.             }
  139.  
  140.             return false;
  141.         }
  142.         return true;
  143.     }
  144. }
  145.  
  146. fn main() {
  147.     let t = input::<i32>();
  148.  
  149.     for _ in 0..t {
  150.         let (n, m) = input_pair::<usize>();
  151.  
  152.         let mut vec = vec![vec![0; m]; n];
  153.  
  154.         for i in &mut vec {
  155.             *i = input_vec::<i32>();
  156.         }
  157.  
  158.         let mut map = Vec::<(i32, usize, usize)>::new();
  159.  
  160.         for i in 0..n {
  161.             for q in 0..m {
  162.                 unsafe {
  163.                     if *vec.get_unchecked(i).get_unchecked(q) < 0 {
  164.                         map.push((*vec.get_unchecked(i).get_unchecked(q), i, q));
  165.                     }
  166.                 }
  167.             }
  168.         }
  169.  
  170.         map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
  171.  
  172.         let mut ch = true;
  173.  
  174.         while !map.is_empty() {
  175.             unsafe {
  176.                 let b = change(
  177.                     map.get_unchecked(0).1,
  178.                     map.get_unchecked(0).2,
  179.                     n,
  180.                     m,
  181.                     &mut vec,
  182.                     &mut map,
  183.                 );
  184.  
  185.                 if !b && !ch {
  186.                     break;
  187.                 }
  188.  
  189.                 ch = b;
  190.                 map.remove(0);
  191.             }
  192.         }
  193.  
  194.         let mut sum = 0_i128;
  195.  
  196.         for i in 0..n {
  197.             for q in 0..m {
  198.                 unsafe {
  199.                     sum += *vec.get_unchecked(i).get_unchecked(q) as i128;
  200.                 }
  201.             }
  202.         }
  203.  
  204.         println!("{}", sum);
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement