Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::fmt::Debug;
- use std::io;
- use std::num::ParseIntError;
- use std::str::FromStr;
- #[inline]
- fn input<T: FromStr<Err = ParseIntError> + Debug>() -> T {
- let mut input = String::new();
- io::stdin().read_line(&mut input).unwrap();
- input.trim().parse().unwrap()
- }
- #[inline]
- fn input_vec<T: FromStr<Err = ParseIntError> + Debug>() -> Vec<T> {
- let mut input = String::new();
- io::stdin().read_line(&mut input).unwrap();
- input
- .split_ascii_whitespace()
- .map(|x| x.parse::<T>().unwrap())
- .collect()
- }
- #[inline]
- fn input_pair<T: FromStr<Err = ParseIntError> + Debug>() -> (T, T) {
- let mut input = String::new();
- io::stdin().read_line(&mut input).unwrap();
- let mut input = input.split_ascii_whitespace();
- (
- input.next().unwrap().parse().unwrap(),
- input.next().unwrap().parse().unwrap(),
- )
- }
- fn main() {
- let t = input::<i32>();
- for _ in 0..t {
- let (n, m) = input_pair::<usize>();
- let mut vec = vec![vec![0; m]; n];
- for i in &mut vec {
- *i = input_vec::<i32>();
- }
- let mut map = Vec::<(i32, usize, usize)>::new();
- for i in 0..n {
- for q in 0..m {
- unsafe {
- if *vec.get_unchecked(i).get_unchecked(q) <= 0 {
- map.push((*vec.get_unchecked(i).get_unchecked(q), i, q));
- }
- }
- }
- }
- map.sort_by(|x, y| (x.0).partial_cmp(&y.0).unwrap());
- let mut sum = 0_i128;
- for i in 0..n {
- for q in 0..m {
- unsafe {
- sum += (*vec.get_unchecked(i).get_unchecked(q)).abs() as i128;
- }
- }
- }
- if map.len() % 2 != 0 {
- let mut min = 101;
- for i in 0..n {
- for q in 0..m {
- unsafe {
- if min > (*vec.get_unchecked(i).get_unchecked(q)).abs() {
- min = (*vec.get_unchecked(i).get_unchecked(q)).abs();
- }
- }
- }
- }
- sum -= min as i128 * 2;
- }
- println!("{}", sum);
- }
- }
Add Comment
Please, Sign In to add comment