提出 #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)
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
400 / 400 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |