提出 #56582177


ソースコード 拡げる

#![allow(unused)]

fn main() {
    let n = read::<usize>();
    let mut arr = vec![vec![vec![0; n]; n]; n];
    for x in 0..n {
        for y in 0..n {
            arr[x][y] = readv::<i64>();
        }
    }

    let mut pref = vec![];
    for x in 0..n {
        pref.push(build_2d(&arr[x]));
    }

    let q = read::<usize>();
    let mut ans = vec![];
    for _ in 0..q {
        let ask = readv::<usize>();
        let (x1, x2) = (ask[0] - 1, ask[1] - 1);
        let (y1, y2) = (ask[2] - 1, ask[3] - 1);
        let (z1, z2) = (ask[4] - 1, ask[5] - 1);
        let mut res = 0;
        for x in x1..=x2 {
            res += query_2d(&pref[x], y1, y2, z1, z2);
        }
        ans.push(res);
    }

    println!("{}", join(&ans, "\n"));
}

fn build_2d(arr: &Vec<Vec<i64>>) -> Vec<Vec<i64>> {
    let (nr, nc) = (arr.len(), arr[0].len());
    let mut pref = vec![vec![0; nc]; nr];
    let transition = [((-1, 0), 1), ((0, -1), 1), ((-1, -1), -1)];
    for r in 0..nr {
        for c in 0..nc {
            pref[r][c] = arr[r][c];
            for &((dr, dc), s) in transition.iter() {
                let pr = r.checked_add_signed(dr).unwrap_or(nr);
                let py = c.checked_add_signed(dc).unwrap_or(nc);
                if pr < nr && py < nc {
                    pref[r][c] += s * pref[pr][py];
                }
            }
        }
    }
    pref
}

// arr[r1..=r2, c1..=c2]
fn query_2d(pref: &Vec<Vec<i64>>, r1: usize, r2: usize, c1: usize, c2: usize) -> i64 {
    let (nr, nc) = (pref.len(), pref[0].len());
    let r1 = r1.checked_add_signed(-1).unwrap_or(nr);
    let c1 = c1.checked_add_signed(-1).unwrap_or(nc);
    let transition = [((r2, c2), 1), ((r1, c2), -1), ((r2, c1), -1), ((r1, c1), 1)];
    let mut res = 0;
    for ((r, c), s) in transition {
        if r < nr && c < nc {
            res += s * pref[r][c];
        }
    }
    res
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn readv<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_ascii_whitespace()
        .map(|t| t.parse().ok().unwrap())
        .collect()
}

fn reads() -> Vec<char> {
    read::<String>().chars().collect()
}

fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
    arr.iter().map(f).collect()
}

fn join<T: ToString>(arr: &[T], sep: &str) -> String {
    arr.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

提出情報

提出日時
問題 D - Cuboid Sum Query
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 400
コード長 2607 Byte
結果 AC
実行時間 199 ms
メモリ 34996 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 2
AC × 22
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 02_maximum_00.txt, 02_maximum_01.txt, 02_maximum_02.txt, 02_maximum_03.txt, 02_maximum_04.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 1912 KiB
00_sample_01.txt AC 1 ms 1932 KiB
01_random_00.txt AC 145 ms 32608 KiB
01_random_01.txt AC 102 ms 27972 KiB
01_random_02.txt AC 106 ms 25464 KiB
01_random_03.txt AC 80 ms 18276 KiB
01_random_04.txt AC 135 ms 31792 KiB
01_random_05.txt AC 71 ms 25296 KiB
01_random_06.txt AC 99 ms 24668 KiB
01_random_07.txt AC 59 ms 16128 KiB
01_random_08.txt AC 101 ms 26216 KiB
01_random_09.txt AC 104 ms 27004 KiB
01_random_10.txt AC 142 ms 32244 KiB
01_random_11.txt AC 118 ms 27544 KiB
01_random_12.txt AC 62 ms 15472 KiB
01_random_13.txt AC 126 ms 30132 KiB
01_random_14.txt AC 139 ms 32340 KiB
02_maximum_00.txt AC 184 ms 34636 KiB
02_maximum_01.txt AC 199 ms 34936 KiB
02_maximum_02.txt AC 196 ms 34944 KiB
02_maximum_03.txt AC 191 ms 34944 KiB
02_maximum_04.txt AC 193 ms 34996 KiB