Hướng dẫn cho SGAME4


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: vinhntndu

Xét một cạnh giữa các đỉnh \(u\)\(v\) (gọi \(u\) là cha của \(v\)).
Gọi cạnh này là "heavy" nếu kích thước của cây con gốc ở \(v\) ít nhất bằng một nửa kích thước của cây con bắt nguồn từ \(u\), và ngược lại.

Lưu ý: mỗi cha có nhiều nhất một cạnh "heavy" cho một con, vì vậy các cạnh "heavy" sẽ tạo thành các chuỗi. Ta sẽ xét từng chuỗi "heavy" riêng biệt.
Suy ra, bất kỳ đường dẫn nào từ một đỉnh đến gốc đều có nhiều nhất các cạnh "light".
Đường đi này cũng có nhiều nhất là \(\log(n)\) chuỗi "heavy", vì một cạnh "light" tách ra mỗi hai chuỗi "heavy".
Điều này có nghĩa là chúng ta có thể chia đường đi này thành \(\log(n)\) mảng, do đó, việc thêm thóc theo đường dẫn từ một đỉnh đến gốc sẽ mất thời gian \(O(\log(n))\) bằng cách thêm nó vào từng cạnh "light" và chuỗi "heavy" trên đường dẫn.

Lưu ý: ta sẽ cần tăng từng chuỗi "heavy" bằng một data-structure như Range Tree hoặc BIT vì ta có thể chỉ cần bỏ thóc trên tiền tố của chuỗi "heavy".
Để Update một đường đi tùy ý, lưu ý: bỏ 1 thùng thóc trên mỗi cạnh dọc theo đường dẫn từ \(A\) đến \(B\) giống như bỏ 1 thùng thóc trên mỗi cạnh từ \(A\) đến gốc, bỏ 1 thùng thóc trên mỗi cạnh từ \(B\) đến gốc và bỏ \(-2\) thùng thóc trên mỗi cạnh từ \(LCA(A,B)\) đến gốc.



Bình luận

Không có bình luận nào.