Professional Documents
Culture Documents
Solution 3
Solution 3
Bài 1 : NPD
- Một số chia hết cho 3 và có đúng 9 ước nguyên dương sẽ có dạng 9𝑝2
với 𝑝 là một số nguyên tố
- Bài toán quy về đếm số lượng số 𝑝 thỏa mãn
𝐿 𝑅
𝐿 ≤ 9𝑝2 ≤ 𝑅 → √ ≤ 𝑝 ≤ √
9 9
- ĐPT : 𝑂(𝑇 ∗ 𝑙𝑜𝑔𝑛) với 𝑛 là số lượng số nguyên tố ≤ 106
- Code mẫu : NPD
Bài 2 : TOUR
- Với một hình chữ nhật (𝑥1, 𝑦1, 𝑥2, 𝑦2) số lượng cây nằm trên các cạnh
sẽ là tổng của 4 loại điểm sau :
o Số điểm có 𝑥 = 𝑥1 và 𝑦1 ≤ 𝑦 ≤ 𝑦2 (1)
o Số điểm có 𝑥 = 𝑥2 và 𝑦1 ≤ 𝑦 ≤ 𝑦2 (2)
o Số điểm có 𝑦 = 𝑦1 và 𝑥1 < 𝑥 < 𝑥2 (3)
o Số điểm có 𝑦 = 𝑦2 và 𝑥1 < 𝑥 < 𝑥2 (4)
- Cách 1 : Sử dụng vector lưu tọa độ 𝑥, 𝑦 rồi tìm kiếm nhị phân
- Cách 2 : Tìm kiếm nhị phân theo cặp pair.
o Ví dụ với các điểm loại (1) và (2). Ta sắp xếp theo cặp (𝑥, 𝑦) tăng
dần với các điểm. Khi đó số điểm loại (1) sẽ bằng :
𝒖𝒑𝒑𝒆𝒓𝒃𝒐𝒖𝒏𝒅(𝒑𝒂𝒊𝒓(𝒙𝟏, 𝒚𝟐)) − 𝒍𝒐𝒘𝒆𝒓𝒃𝒐𝒖𝒏𝒅((𝒙𝟏, 𝒚𝟏))
o Tương tự với các điểm loại (2)
o Các điểm loại (3), (4) ta cũng làm tương tự nhưng vì tìm theo 𝑦
ta sắp xếp các điểm theo cặp (𝑦, 𝑥) tăng dần. Khi đó số điểm loại
(3) sẽ bằng :
𝒍𝒐𝒘𝒆𝒓𝒃𝒐𝒖𝒏𝒅(𝒑𝒂𝒊𝒓(𝒚𝟏, 𝒙𝟐)) − 𝒖𝒑𝒑𝒆𝒓𝒃𝒐𝒖𝒏𝒅(𝒑𝒂𝒊𝒓(𝒚𝟏, 𝒙𝟏))
*Phải lấy lowerbound trừ upperbound vì ta không lấy dấu bằng ở
2 đầu
- ĐPT : 𝑂(𝑛𝑙𝑜𝑔𝑛)
Bài 3 : FLIRT
- Bài toán cực tiểu hóa 1 hàm cực đại ta có thể quy về tìm kiếm nhị phân
- Giả sử đáp án ≤ 𝑥. Khi đó khoảng cách giữa 2 phần từ liên tiếp ≤ 𝑥.
- Bài toán quy về tìm số thao tác ít nhất để chênh lệch giữa 2 phần tử liên
tiếp ≤ 𝑥.
- Gọi 𝑑𝑝[𝑖] là số thao tác ít nhất để chênh lệch giữa 2 số liên tiếp ≤ 𝑥
- Xét 1 đoạn [𝑗, 𝑖] bất kỳ, điều kiện để đoạn [𝑗, 𝑖] tạo thành một dãy sao
cho chênh lệch 2 số liên tiếp ≤ 𝑥 nếu 𝑎[𝑗] và 𝑎[𝑖] giữ nguyên sẽ là
|𝑎[𝑖] − 𝑎[𝑗]| ≤ (𝑖 − 𝑗) ∗ 𝑥
Từ đó ta có công thức : 𝑑𝑝[𝑖] = min (𝑑𝑝[𝑗] + 𝑖 − 𝑗 − 1) nếu
|𝑎[𝑖] − 𝑎[𝑗]| ≤ (𝑖 − 𝑗) ∗ 𝑥
- Đáp án sẽ là min (𝑑𝑝[𝑖] + 𝑛 − 𝑖)
- Ta chỉ cần kiểm tra số thao tác này có thỏa mãn ≤ 𝑘 hay không
- ĐPT : 𝑂(𝑛2 log(2.109 ))
- Code mẫu : FLIRT
Bài 4: A cộng B
Bài 5 : RMQCHK