Quốc gia A được biểu diễn là một cây vô hướng với ~n~ thành phố được nối bởi ~n-1~ đường đi. Chính phủ đang thiết kế hệ thống cơ sở dữ liệu để đánh dấu các vùng xanh để chuẩn bị cho các trường hợp có thiên tai, dịch bệnh xảy ra.
Ta sẽ gọi máy tính lưu toàn bộ cơ sở dữ liệu là máy chủ, các máy của người dân là máy trạm.
Khi thiên tai xảy ra, chính phủ sẽ đánh dấu các vùng xanh, bao gồm một số nguyên dương các thành phố liên thông với nhau (tức, hai thành phố trong vùng xanh luôn đi được tới nhau mà không cần đi ra khỏi vùng xanh).
Máy chủ và các máy trạm đều biết thông tin của cây, tuy nhiên chỉ có máy chủ mới biết thông tin của các vùng xanh và sẽ có một số thời điểm các vùng xanh được cập nhật.
Một quá trình tương tác giữa máy trạm và máy chủ diễn ra như sau:
Khi người dân cần biết thông tin về một số vùng xanh, họ sẽ liệt kê ra một danh sách gồm thành phố họ đang sống và một số thành phố có đường đi trực tiếp với thành phố đó, ta gọi danh sách này là ~P~ (với ~P_0~ là thành phố của họ). Họ cần biết trong ~P~ có tồn tại thành phố thuộc vùng xanh hay không
Họ sẽ gửi một xâu nhị phân rồi gửi cho máy chủ, ta gọi là xâu ~S~.
Máy chủ nhận xâu nhị phân ~S~, gửi về máy trạm xâu nhị phân ~T~.
Máy trạm nhận xâu nhị phân ~T~ và cho biết một thành phố trong danh sách ~P~ thuộc vùng xanh hoặc thông báo không có thành phố nào trong danh sách ~P~ thuộc vùng xanh.
Hãy thiết kế máy chủ và máy trạm sao cho tổng lượng thông tin cần gửi là ít nhất (xem chi tiết ở phần subtask và scoring).
Implementation
Client
Bạn cần cài đặt:
namespace client
Trong client
, bạn cần cài đặt các hàm sau:
void init(vector <int> par)
- Mảng ~par~ có độ dài cho ~n - 1~, biểu diễn các cạnh trong đồ thị, trong đó, với mỗi ~i~ thì có cạnh nối giữa ~i + 1~ và ~par_i~ trên cây (~0 \le i < n - 1~, ~par_i\le i~).
string request(vector <int> P)
- Mảng ~P~ sẽ là danh sách mà người dân muốn kiểm tra, trong đó, ~P_0~ sẽ là thành phố người đó đang sống và có đường đi trực tiếp đến ~P_i~ (~i > 0~). Hàm trả về xâu nhị phân ~S~, xâu này sẽ được gửi cho máy chủ.
int answer(string T)
- Xâu ~T~ là xâu được gửi về từ máy chủ sau khi thực hiện lệnh
request
. Bạn cần trả về một thành phố trong danh sách ~P~ thuộc vùng xanh hoặc trả về ~-1~ nếu không tồn tại.
Server
Bạn cần cài đặt:
namespace server
Trong server
, bạn cần cài đặt các hàm sau:
void init(vector<int> par)
- Mảng ~par~ có độ dài cho ~n - 1~, biểu diễn các cạnh trong đồ thị, trong đó, với mỗi ~i~ thì có cạnh nối giữa ~i + 1~ và ~par_i~ trên cây (~0 \le i < n - 1~, ~par_i\le i~).
void update(vector<int> green)
- Mảng green chứa thông tin các thành phố thuộc vùng xanh.
- Lưu ý: Sau truy vấn này, chỉ có các thành phố này thuộc vùng xanh, các thành phố không trong danh sách này sẽ nằm ngoài vùng xanh.
string query(string S)
- Xâu nhị phân ~S~ được gửi từ máy trạm, hàm cần trả về một xâu nhị phân ~T~.
Note
- Được phép khai báo thêm biến và hàm toàn cục trong hai
namespace
hoặc ngoài hainamespace
, nhưng không được đặt tên hàm làmain
. - Các hàm trong cùng một namespace sẽ dùng chung dữ liệu, các biến toàn cục nằm ngoài hai namespace sẽ bị reset khi truyền thông tin giữa hai hàm.
Subtask
Trong mọi subtask: ~5 \le n \le 65536~.
Trong mỗi test, hàm 'update' và 'request' sẽ được gọi tối đa ~1000~ lần.
Subtask | Điểm | Giới hạn |
---|---|---|
1 | ~10~ | ~|P| = 2~ với mọi lần request |
2 | ~20~ | ~|P| = 3~ với mọi lần request |
3 | ~30~ | ~|P| = 4~ với mọi lần request |
4 | ~40~ | ~|P| \le 5~ với mọi lần request |
Scoring
- Gọi ~d = |S| + |T|~ trong mỗi lần
request
vàquery
. - ~D = max(d)~ trong mọi lần
request
vàquery
. - ~D_{max} = max(D)~ trong mọi test của một subtask và ~T~ là điểm của subtask đó, điểm của bạn cho subtask đó được tính như sau:
~D_{max}~ | Score |
---|---|
~\le 17~ | ~T~ |
~18~ | ~0.85*T~ |
~19~ | ~0.75*T~ |
~20~ | ~0.7*T~ |
~21~ | ~0.65*T~ |
~22~ | ~0.6*T~ |
~23~ | ~0.55*T~ |
~24~ | ~0.5*T~ |
~25~ | ~0.47*T~ |
~26~ | ~0.44*T~ |
~27~ | ~0.41*T~ |
~28~ | ~0.38*T~ |
~29~ | ~0.35*T~ |
~30~ | ~0.32*T~ |
~31~ | ~0.29*T~ |
~32~ | ~0.26*T~ |
~33,34~ | ~0.25*T~ |
~\le 35~ | ~0~ |
Comments