Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

Solution Summer Contest #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 : 𝑂(𝑛𝑙𝑜𝑔𝑛)

- Code mẫu : TOUR

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

- Quy hoạch động


- 𝑓[𝑖][𝑎][𝑏][𝑟𝑒𝑚] là số cặp 𝐴, 𝐵 thỏa mãn điều kiện đề bài khi xét đến chữ
số thứ 𝑖 của 𝐴 và 𝐵, chữ số cuối cùng của 𝐴 là 𝑎, chữ số cuối cùng của 𝐵
là 𝑏 và phép cộng đang dư 𝑟𝑒𝑚.
(𝑐+𝑑+𝑟𝑒𝑚)
- 𝑓[𝑖][𝑎][𝑏][𝑟𝑒𝑚]+= 𝑓[𝑖 − 1][𝑐][𝑑] [ 10
] với
- (1 ? (𝑖 == 0): 0) ≤ 𝑐 ≤ 9 ; 𝑐 ≠ 𝑎
- (1 ? (𝑖 == 0): 0) ≤ 𝑑 ≤ 9; 𝑑 ≠ 𝑏
- (𝑐 + 𝑑 + 𝑟𝑒𝑚)% 10 = 𝐶[𝑖]
- ĐPT : 𝑂(𝑙𝑜𝑔10(𝐶) ∗ 92 ∗ 2)
- Code mẫu : AB

Bài 5 : RMQCHK

- Nhận xét quan trọng :


o Vì giá trị min là đôi một khác nhau, nên không tồn tại 2 đoạn
không giao nhau có cùng giá trị min.
- Ta thấy nếu tại thời điểm 𝑞 đã xảy ra mâu thuẫn thì chắc chắn tại thời
điểm 𝑞 ′ > 𝑞 cũng sẽ vẫn xảy ra mâu thuân → tìm kiếm nhị phân
- Ta đi tìm kiếm nhị phân thời điểm cuối cùng mà tất cả truy vấn vẫn còn
đúng là 𝑟𝑒𝑠. Đáp án thời điểm đầu tiên mâu thuẫn sẽ là 𝑟𝑒𝑠 + 1
- Bài toán quy về cho 𝑞 truy vấn 𝑙, 𝑟, 𝑤 kiểm tra xem có xảy ra mâu thuân
không ?
- Ta sắp xếp các truy vấn theo giá trị 𝑤 tăng dần. Thực hiện 𝑢𝑝𝑑𝑎𝑡𝑒 gán
đoạn [𝑙, 𝑟] giá trị 𝑤.
- Xét lần lượt các truy vấn. Nếu tại thời điểm 𝑖 mâu thuẫn khi và chỉ khi tồn
tại một trong 2 điều kiện sau :
o Tồn tại một đoạn khác không giao với [𝑙𝑖 , 𝑟𝑖 ] mà có cùng 𝑤𝑖
o Tồn tại một đoạn phủ đoạn [𝑙𝑖 , 𝑟𝑖 ] mà có 𝑚𝑖𝑛 khi ta 𝑢𝑝𝑑𝑎𝑡𝑒 từ
đầu khác với 𝑤𝑖
- Kiểm tra điều kiện thứ nhất bằng 2 con trỏ, vì 𝑤𝑖 đã được sắp xếp tăng
dần
- Kiểm tra điều kiện thứ hai bằng SegmentTree
ĐPT : 𝑂(q ∗ logq ∗ logn)
- Code mẫu : RMQCHK

You might also like