TST 2023 - Bài 6

View as PDF

Submit solution

Points: 1.30 (partial)
Time limit: 6.0s
Memory limit: 1G

Author:
Problem source:
Kỳ thi chọn đội tuyển Olympic 2023
Problem type
Allowed languages
C++

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:

  1. 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

  2. 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~.

  3. Máy chủ nhận xâu nhị phân ~S~, gửi về máy trạm xâu nhị phân ~T~.

  4. 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 subtaskscoring).

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 hai namespace, 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 requestquery.
  • ~D = max(d)~ trong mọi lần requestquery.
  • ~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

Please read the guidelines before commenting.


There are no comments at the moment.