Hướng dẫn bài COLTREE - Màu của cây

Trùm CUỐI 2022-01-07 9:49:19 2022-01-07 9:51:08

Link đến trang bài tập

Dễ thấy bằng việc lưu trữ thứ tự DFS, ta có thể chuyển đổi bài toán này thành bài toán: Cho một mảng n phần tử khác nhau và m truy vấn, mỗi truy vấn yêu cầu in ra số lượng giá trị khác nhau trong một khoảng từ L tới R . Trả lời tất cả m truy vấn đó.

Phát biểu theo một cách khác sẽ là: Với mỗi khoảng truy vấn từ L tới R , có bao nhiêu màu sắc mà vị trí xuất hiện đầu tiên không nhỏ hơn L của nó là không lớn hơn R.

Sort tất cả truy vấn theo L trước, nếu L bằng nhau thì sort theo R (ta lưu trữ lại chỉ số của từng truy vấn để in câu trả lời theo đúng thứ tự về sau). Định nghĩa mảng next[i] là vị trí tiếp theo trong mảng có cùng màu với phần tử thứ i (nếu i là phần tử cuối cùng có màu đó thì next[i] = n + 1 ), một cây BIT tính tổng và một biến left = 1 . Quy trình duyệt như sau:

  • Update(x, 1) , với x là các lần xuất hiện đầu tiên của mỗi màu sắc.
  • Khi xét tới truy vấn (L, R) :
    • Chừng nào left < L , ta Update(left, -1) Update(next[left], 1) , sau đó tăng left lên 1 . Như vậy cây BIT sẽ đảm bảo là chỉ mang giá trị 1 ở các vị trí không nhỏ hơn L , và do ta sort các truy vấn theo L nên sẽ chỉ cần left tăng, không bao giờ giảm.
    • Kết quả của truy vấn là GetSum(R) .

Độ phức tạp: O((n + m) logn) .

Lưu ý:

  • Bài này có test rất hiểm, không thể dùng DFS đệ quy được mà phải thực hiện DFS không đệ quy.
  • Dữ liệu đầu vào lớn, phải dùng nhập xuất nhanh (scanf, printf chẳng hạn).

Tổng cộng 2 trả lời

Nguyễn Thế Minh

bài này offline + small to large dc ko nhỉ

Nguyễn Thế Minh

dfs không đệ quy khó thế phải dùng stack đúng ko