Задача
Задана трехмерная таблица чисел [latex]a_{ijt}[/latex], где [latex]1\leq i\leq n[/latex], [latex]1\leq j\leq m[/latex], [latex]1\leq t\leq k[/latex]. Для заданных [latex]l_{x}, l_{y}, l_{z},r_{x}, r_{y}, r_{z}[/latex] найдите
[latex]S_{l_{x}, l_{y}, l_{z},r_{x}, r_{y}, r_{z}}=\sum\limits_{i=lx,j=ly,t=lz}^{i\leq rx,j\leq ry,t\leq rz}a_{ijt}[/latex]
Входные данные
В первой строке записаны размеры таблицы — [latex]n, m, k \left ( 1\leq n, m, k\leq 100 \right )[/latex]. Далее записано [latex]n[/latex] блоков по [latex]m[/latex] строк, в каждой из которых записaно по [latex]k[/latex] чисел [latex]a_{ijt} \left ( 1\leq a_{ijt} \leq 1000 \right )[/latex]. Блоки разделены пустой строкой. В очередной строке записано число [latex]q \left ( 1\leq q\leq 10^{6} \right )[/latex] — количество запросов. В следующих [latex]q[/latex] строках описаны запросы [latex]l_{x_{i}}, l_{y_{i}}, l_{z_{i}}, r_{x_{i}}, r_{y_{i}}, r_{z_{i}}[/latex][latex]\left ( 1 \leq l_{x_{i}} \leq r_{x_{i}} \leq n, 1 \leq l_{y_{i}} \leq r_{y_{i}} \leq m, 1 \leq l_{z_{i}} \leq r_{z_{i}} \leq k \right )[/latex] .
Выходные данные
Выведите [latex]q[/latex] чисел в отдельных строках — ответы на запросы.
Тесты
№ | Входные данные | Выходные данные |
1 | 2 3 5 1 2 3 4 5 5 4 3 2 1 2 3 1 5 41 2 3 4 5 5 4 3 2 1 2 3 1 5 4 5 1 1 1 1 2 2 1 1 1 2 2 2 1 2 3 2 3 4 1 3 4 2 3 5 1 2 4 2 2 5 |
12 24 22 18 6 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <iostream> using namespace std; const long long INF = 105; long long arr[INF][INF][INF]; long long amountArray[INF][INF][INF]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long n,m,k; cin >> n >> m >> k; for(int i = 1 ; i <= n; i++){ for(int j = 1 ; j <= m ; j++){ for(int z = 1 ; z <= k ; z++){ cin >> arr[i][j][z]; } } } for(int i = 1 ; i <= n; i++){ for(int j = 1; j <= m ; j++){ amountArray[i][j][1] = amountArray[i-1][j][1] + amountArray[i][j-1][1] - amountArray[i-1][j-1][1] + arr[i][j][1]; } } for(int i = 1 ; i <= m; i++){ for(int j = 1; j <= k ; j++){ amountArray[1][i][j] = amountArray[1][i-1][j] + amountArray[1][i][j-1] - amountArray[1][i-1][j-1] + arr[1][i][j]; } } for(int i = 1 ; i <= n; i++){ for(int j = 1; j <= k ; j++){ amountArray[i][1][j] = amountArray[i-1][1][j] + amountArray[i][1][j-1] - amountArray[i-1][1][j-1] + arr[i][1][j]; } } for(int i = 2; i <= n; i++){ for(int j = 2; j <= m ; j++){ for(int z = 2; z <= k; z++){ amountArray[i][j][z] = arr[i][j][z] + amountArray[i-1][j][z] + amountArray[i][j-1][z] - amountArray[i-1][j-1][z] + amountArray[i][j][z-1] - amountArray[i-1][j][z-1] - amountArray[i][j-1][z-1] + amountArray[i-1][j-1][z-1]; } } } long long q; cin >> q; while(q--){ long long x1, y1, z1, x2, y2, z2; cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2; x1--; y1--; z1--; cout << amountArray[x2][y2][z2] - amountArray[x2][y2][z1] - amountArray[x2][y1][z2] + amountArray[x2][y1][z1] - amountArray[x1][y2][z2] + amountArray[x1][y1][z2] + amountArray[x1][y2][z1] - amountArray[x1][y1][z1] << "\n"; } return 0; } |
Решение
Создаем массивы arr — массив элементов исходной матрицы, и amountArray — массив количества элементов «на префиксе». В первой тройке вложенных циклов for заполняем массив arr. Затем в трех парах вложенных массивов заполняем соответственно первый «этаж» матрицы amountArray, первую строку и первый столбец всех «этажей». Далее, в тройке вложенных циклов for заполняем оставшиеся элементы массива. После, читаем запросы и выводим ответы.