Mô tả bài toán
Cho ma trận m x n và giá trị k. Giá trị tại tọa độ (a, b) là XOR của tất cả matrix[i][j] với 0 <= i <= a, 0 <= j <= b. Tìm giá trị lớn thứ k (1-indexed) среди tất cả các tọa độ.
Ví dụ
Ma trận [[5,2],[1,6]], k = 1 -> đầu ra 7 (tọa độ (0,1): 5 XOR 2 = 7).
Giải thuật
- Tính prefix XOR theo hàng, rồi theo cột để có giá trị mỗi tọa độ.
- Duyệt các giá trị, dùng từ điển
seenđếm tần suất. - Giữ tối đa
kgiá trị lớn nhất: khi số lượng >k, loại bỏ giá trị nhỏ nhất. - Trả về giá trị nhỏ nhất trong
seen(là giá trị lớn thứ k).
Triển khai Python
def solve(matrix, k):
m, n = len(matrix), len(matrix[0])
for i in range(m):
for j in range(n):
if j:
matrix[i][j] ^= matrix[i][j-1]
seen = {}
count = 0
for i in range(n):
for j in range(m):
if j:
matrix[j][i] ^= matrix[j-1][i]
seen[matrix[j][i]] = seen.get(matrix[j][i], 0) + 1
count += 1
if count > k:
min_value = min(seen)
seen[min_value] -= 1
if not seen[min_value]:
seen.pop(min_value)
return min(seen)
matrix = [[5, 2], [1, 6]]
k = 1
print(solve(matrix, k))
Đầu vào
[[5,2],[1,6]], 1
Đầu ra
7