洛谷题单入门4-P5729 【深基5.例7】工艺品制作-python
输入格式
第一行三个正整数 w,x,h。
第二行一个正整数 q。
接下来 q 行,每行六个整数
输出格式
输出一个整数表示答案。
三维数组直接标记
class Solution:
@staticmethod
def oi_input():
"""从标准输入读取数据"""
w, x, h = map(int, input().split())
q = int(input())
intervals = []
for _ in range(q):
intervals.append(list(map(int, input().split())))
return w, x, h, intervals
@staticmethod
def oi_test():
"""提供测试数据"""
return (4, 4, 4, [[1, 1, 1, 2, 2, 2]])
@staticmethod
def solution(w, x, h, intervals):
# 初始化三维数组,所有位置初始为1
cube = [[[1 for _ in range(h + 1)] for _ in range(x + 1)] for __ in range(w + 1)]
# 处理每次切割
for interval in intervals:
x1, y1, z1, x2, y2, z2 = interval
for i in range(x1, x2 + 1):
for j in range(y1, y2 + 1):
for k in range(z1, z2 + 1):
cube[i][j][k] = 0
# 统计剩余的小方块数目
count = 0
for i in range(1, w + 1):
for j in range(1, x + 1):
for k in range(1, h + 1):
count += cube[i][j][k]
return count
oi_input = Solution.oi_input
oi_test = Solution.oi_test
solution = Solution.solution
if __name__ == '__main__':
w, x, h, intervals = oi_test()
# w, x, h, intervals = oi_input()
print(solution(w, x, h, intervals))
三维差分数组
class Solution:
@staticmethod
def oi_input():
"""从标准输入读取数据"""
w, x, h = map(int, input().split())
q = int(input())
intervals = []
for _ in range(q):
intervals.append(list(map(int, input().split())))
return w, x, h, intervals
@staticmethod
def oi_test():
"""提供测试数据"""
return (4, 4, 4, [[1, 1, 1, 2, 2, 2]])
@staticmethod
def solution(w, x, h, intervals):
diff = [[[0] * (h + 2) for _ in range(x + 2)] for __ in range(w + 2)]
for x1, y1, z1, x2, y2, z2 in intervals:
diff[x1][y1][z1] += 1
diff[x1][y1][z2 + 1] -= 1
diff[x1][y2 + 1][z1] -= 1
diff[x1][y2 + 1][z2 + 1] += 1
diff[x2 + 1][y1][z1] -= 1
diff[x2 + 1][y1][z2 + 1] += 1
diff[x2 + 1][y2 + 1][z1] += 1
diff[x2 + 1][y2 + 1][z2 + 1] -= 1
# Calculate prefix sums
for j in range(1, x + 1):
for k in range(1, h + 1):
for i in range(1, w + 1):
diff[i][j][k] += diff[i - 1][j][k]
for i in range(1, w + 1):
for k in range(1, h + 1):
for j in range(1, x + 1):
diff[i][j][k] += diff[i][j - 1][k]
for i in range(1, w + 1):
for j in range(1, x + 1):
for k in range(1, h + 1):
diff[i][j][k] += diff[i][j][k - 1]
count = 0
for i in range(1, w + 1):
for j in range(1, x + 1):
for k in range(1, h + 1):
if diff[i][j][k] == 0:
count += 1
return count
oi_input = Solution.oi_input
oi_test = Solution.oi_test
solution = Solution.solution
if __name__ == '__main__':
w, x, h, intervals = oi_test()
# w, x, h, intervals = oi_input()
print(solution(w, x, h, intervals))