trang chủ / đề bài / psum3d / lời giải

Tổng khối con

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Hướng tiếp cận

Bài toán là mở rộng tự nhiên của kỹ thuật prefix sum (tổng tiền tố) từ một chiều và hai chiều lên ba chiều. Với mỗi truy vấn ta cần tính tổng các phần tử trong một hộp chữ nhật. Nếu duyệt trực tiếp thì độ phức tạp là O(q·X·Y·Z), có thể lên tới 2·1011 phép cộng — không đạt yêu cầu.

Ta tiền xử lý mảng tổng tiền tố 3 chiều S rồi mỗi truy vấn chỉ cần O(1).

Nhận xét quan trọng

  1. Định nghĩa S[i][j][k] là tổng của tất cả A[i′][j′][k′] với 1≤i′≤i, 1≤j′≤j, 1≤k′≤k (quy ước S=0 nếu một chỉ số là 0).
  2. Theo nguyên lý bao hàm – loại trừ trong không gian 3 chiều, hộp [1..i]×[1..j]×[1..k] có thể được phân tích qua các hộp con trừ phần giao nhau ba mặt.
  3. Bộ nhớ: vì X·Y·Z≤106, ta dùng một mảng phẳng 1 chiều với chỉ số i·(Y+1)(Z+1)+j·(Z+1)+k để tiết kiệm cấp phát.

Thuật toán

Xây dựng S. Khởi tạo S là mảng (X+1)(Y+1)(Z+1) giá trị 0, sau đó với mọi 1≤i≤X, 1≤j≤Y, 1≤k≤Z:

S[i][j][k]=A[i][j][k]+S[i−1][j][k]+S[i][j−1][k]+S[i][j][k−1] −S[i−1][j−1][k]−S[i−1][j][k−1]−S[i][j−1][k−1]+S[i−1][j−1][k−1].

Trả lời truy vấn. Với truy vấn (x1,y1,z1,x2,y2,z2):

ans=S[x2][y2][z2]−S[x1−1][y2][z2]−S[x2][y1−1][z2]−S[x2][y2][z1−1] +S[x1−1][y1−1][z2]+S[x1−1][y2][z1−1]+S[x2][y1−1][z1−1]−S[x1−1][y1−1][z1−1].

Quy luật dấu: với t là số chỉ số bị giảm xuống −1 (tức dùng x1−1, y1−1, hoặc z1−1), hệ số là (−1)t. Tổng cộng có 23=8 số hạng.

Lưu ý cài đặt.

  • Dùng long long vì tổng có thể đạt 106·109=1015.
  • Đọc/xuất I/O nhanh (scanf/printf hoặc sys.stdin.read cho Python).
  • Mảng phẳng 1 chiều giúp truy cập cache thân thiện và tránh nhiều lần cấp phát.

Độ phức tạp

  • Thời gian: O(X·Y·Z+q).
  • Bộ nhớ: O(X·Y·Z).

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0