Hướng dẫn giải của Vòi Phun Nước
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.
Lời giải: Vòi Phun Nước (Sprinklers)
Nhận xét quan trọng
Trước hết, cần xác định điều kiện để một điểm là hợp lệ:
- Được tưới nước: tồn tại vòi tại với và .
- Được bón phân: tồn tại vòi tại với và .
Do các vòi tạo thành một hoán vị (mỗi hàng và cột có đúng một vòi), ta có thể xác định:
- Điểm được tưới nước tồn tại sao cho (với là tọa độ của vòi ở cột ).
- Điểm được bón phân tồn tại sao cho .
Định nghĩa:
- = giá trị nhỏ nhất của sao cho hợp lệ (tức là tọa độ nhỏ nhất để cột đó "kích hoạt" phân bón cho ).
- = giá trị lớn nhất sao cho có thể là cạnh phải của một hình chữ nhật.
Thuật toán
Bài toán yêu cầu đếm số cặp với , sao cho toàn bộ hình chữ nhật hợp lệ.
Ý tưởng chính: Duyệt từ 1 đến , với mỗi cố định, đếm số cặp hợp lệ.
Tính và
- : -tối đa để cột có thể là cạnh trái.
- : với mỗi , đây là -tối thiểu để điểm hợp lệ. Tính bằng cách duyệt giảm dần: với vòi tại cột (tọa độ là ), cập nhật tất cả có .
Đếm tổng hình chữ nhật
Với cố định, số cặp hợp lệ với cố định là: (tổng số cặp với , nhân với số lựa chọn ).
Trừ các hình chữ nhật không hợp lệ (bad)
Một hình chữ nhật không hợp lệ khi có điểm không hợp lệ, tức là .
Với cận dưới của vùng được xét, ta chia thành 2 trường hợp:
- : Dùng công thức trực tiếp .
- : Dùng prefix sum: .
Với mỗi , con trỏ di chuyển đơn điệu (do tính đơn điệu của ), nên tổng thời gian xử lý là .
Tổng kết
Độ phức tạp
- Thời gian:
- Bộ nhớ:
Điểm mấu chốt là tính đơn điệu của mảng (không tăng khi tăng) và (không tăng khi tăng), cho phép dùng hai con trỏ và prefix sum để giải trong .
Bình luận