Codeforces - 356A - Knight Tournament
★ Today's tune: https://youtu.be/Y9NpOCWcz8E (hôm nay hơi lạnh nên nghe bài này)
★ Link: https://codeforces.com/contest/356/problem/A
★ Tags: segment tree, dsu
★ Difficulty: 1500
★ Kiến thức: https://vnoi.info/wiki/algo/data-structures/segment-tree-extend.md
★ Tóm tắt:
Cho n võ sĩ được đánh số theo thứ tự từ 1 -> n.
Có m trận đấu đã diễn ra, biết rằng trận đấu thứ j gồm các võ sĩ có số từ Lj đến Rj tham gia và chỉ có một võ sĩ thắng mang số Xj.
Hãy cho biết từng võ sĩ bị đánh bại bởi võ sĩ nào.
★ Ý tưởng: Bài này có nhiều cách xử lý. Tuy nhiên ở đây sẽ sử dụng segment tree kết hợp lazy propagation để đánh dấu.
Với một trận đấu bất kỳ:
- Gọi võ sĩ đánh thắng trận đấu là bố.
- Update các võ sĩ trong đoạn [L...X - 1] có bố là X nếu đoạn đó chưa có bố.
- Update các võ sĩ trong đoạn [X + 1...R] có bố là X nếu đoạn đó chưa có bố.
★ Lưu ý: trong code có sử dụng trick xử lý bit thay cho phép nhân và cộng để code chạy nhanh hơn (k<<1 = k*2, k<<1|1 = k*2 + 1).
★ Code: https://ideone.com/CSqelc
Comments
Post a Comment