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.
Hướng tiếp cận
Bài toán yêu cầu tìm cạnh lớn nhất sao cho tồn tại một hình vuông có tổng . Hai kĩ thuật then chốt:
- Tổng tiền tố 2D (2D prefix sum) để tính tổng của một sub-rectangle bất kì trong .
- Chặt nhị phân (binary search) trên đáp án , dựa trên một tính chất đơn điệu.
Nhận xét quan trọng
Đặt tổng trên mọi hình vuông trong . Vì mọi phần tử của đều không âm, nên với bất kỳ hình vuông nào, ta đều có thể "thu nhỏ" nó về một hình vuông bằng cách bỏ bớt một hàng và một cột; tổng của hình vuông không lớn hơn tổng của hình vuông . Do đó — hàm không giảm theo .
Suy ra: tập các thoả mãn là một tiền tố . Ta có thể chặt nhị phân để tìm .
Tổng của một hình vuông tối đa là , vượt phạm vi -bit. Phải dùng -bit (long long) khi xây mảng tiền tố và khi tính hiệu.
Thuật toán
Bước 1. Xây mảng tiền tố D: với công thức
Bước 2. Định nghĩa hàm fits(k): tồn tại hình vuông với tổng hay không. Với mỗi vị trí góc trên-trái (với , ), tổng hình vuông tính bằng
fits(k) trả về true khi và chỉ khi giá trị nhỏ nhất trong các tổng đó . Phép kiểm tra này chạy trong .
Bước 3. Chặt nhị phân trên : tìm lớn nhất sao cho fits(k) = true.
Độ phức tạp
- Thời gian: . Với , đây là khoảng phép tính — rất nhanh.
- Bộ nhớ: cho mảng tiền tố.
Bình luận