IOI 2021 - Dungeons Game
Xem PDFRobert đang thiết kế một trò chơi máy tính mới. Trò chơi gồm một anh hùng, \(n\) đối thủ và \(n+1\) ngục tối. Các đối thủ được đánh số từ \(0\) đến \(n-1\), còn các ngục tối được đánh số từ \(0\) đến \(n\). Đối thủ \(i\) (\(0\le i\le n-1\)) ở trong ngục tối \(i\) và có sức mạnh \(s[i]\). Không có đối thủ nào trong ngục tối \(n\).
Anh hùng bắt đầu bằng việc đi vào ngục tối \(x\) với sức mạnh \(z\). Mỗi khi anh hùng đi vào một ngục tối \(i\) (\(0\le i\le n-1\)), anh hùng đối đầu với đối thủ \(i\) và một trong các tình huống sau xảy ra:
- Nếu sức mạnh của anh hùng lớn hơn hoặc bằng sức mạnh \(s[i]\) của đối thủ, anh hùng thắng. Sức mạnh của anh hùng tăng thêm \(s[i]\) (\(s[i]\ge 1\)). Sau đó, anh hùng đi vào ngục tối \(w[i]\) (\(w[i]>i\)).
- Ngược lại, anh hùng thua. Sức mạnh của anh hùng tăng thêm \(p[i]\) (\(p[i]\ge 1\)). Sau đó, anh hùng đi vào ngục tối \(l[i]\).
Lưu ý rằng \(p[i]\) có thể nhỏ hơn, bằng hoặc lớn hơn \(s[i]\). Tương tự, \(l[i]\) có thể nhỏ hơn, bằng hoặc lớn hơn \(i\). Bất kể kết quả đối đầu, đối thủ vẫn ở trong ngục tối \(i\) và giữ nguyên sức mạnh \(s[i]\).
Trò chơi kết thúc khi anh hùng đi vào ngục tối \(n\). Có thể chứng minh rằng trò chơi kết thúc sau một số hữu hạn lần đối đầu, bất kể ngục tối bắt đầu và sức mạnh ban đầu của anh hùng.
Robert nhờ bạn kiểm thử trò chơi bằng cách chạy \(q\) lần mô phỏng. Với mỗi lần mô phỏng, Robert cho ngục tối bắt đầu \(x\) và sức mạnh ban đầu \(z\). Nhiệm vụ của bạn là tìm sức mạnh của anh hùng khi trò chơi kết thúc trong mỗi lần mô phỏng.
Chi tiết cài đặt
Bạn cần cài đặt các hàm sau:
void init(int n, std::vector<int> s, std::vector<int> p,
std::vector<int> w, std::vector<int> l);
n: số đối thủ.s,p,w,l: các mảng độ dài \(n\). Với mỗi \(0\le i\le n-1\):- \(s[i]\) là sức mạnh của đối thủ \(i\), cũng là lượng sức mạnh anh hùng nhận thêm sau khi thắng đối thủ \(i\).
- \(p[i]\) là lượng sức mạnh anh hùng nhận thêm sau khi thua đối thủ \(i\).
- \(w[i]\) là ngục tối anh hùng đi vào sau khi thắng đối thủ \(i\).
- \(l[i]\) là ngục tối anh hùng đi vào sau khi thua đối thủ \(i\).
- Hàm này được gọi đúng một lần, trước mọi lời gọi tới
simulatedưới đây.
long long simulate(int x, int z);
x: ngục tối đầu tiên anh hùng đi vào.z: sức mạnh ban đầu của anh hùng.- Hàm cần trả về sức mạnh của anh hùng khi trò chơi kết thúc, với giả thiết anh hùng bắt đầu bằng việc đi vào ngục tối \(x\) với sức mạnh \(z\).
- Hàm này được gọi đúng \(q\) lần.
Dữ liệu vào
Trình chấm mẫu đọc dữ liệu theo định dạng sau:
- Dòng \(1\):
n q. - Dòng \(2\): \(s[0]\ s[1]\ \ldots\ s[n-1]\).
- Dòng \(3\): \(p[0]\ p[1]\ \ldots\ p[n-1]\).
- Dòng \(4\): \(w[0]\ w[1]\ \ldots\ w[n-1]\).
- Dòng \(5\): \(l[0]\ l[1]\ \ldots\ l[n-1]\).
- Dòng \(6+i\) (\(0\le i\le q-1\)):
x zcho lời gọisimulatethứ \(i\).
Dữ liệu ra
Trình chấm mẫu in câu trả lời theo định dạng sau:
- Dòng \(1+i\) (\(0\le i\le q-1\)): giá trị trả về của lời gọi
simulatethứ \(i\).
Ràng buộc
- \(1\le n\le 400\,000\).
- \(1\le q\le 50\,000\).
- \(1\le s[i],p[i]\le 10^7\) với mọi \(0\le i\le n-1\).
- \(0\le l[i],w[i]\le n\) với mọi \(0\le i\le n-1\).
- \(w[i]>i\) với mọi \(0\le i\le n-1\).
- \(0\le x\le n-1\).
- \(1\le z\le 10^7\).
Phân nhóm
| Nhóm | Điểm | Ràng buộc bổ sung |
|---|---|---|
| 1 | 11 | \(n\le 50\,000\), \(q\le 100\), \(s[i],p[i]\le 10\,000\) với mọi \(0\le i\le n-1\). |
| 2 | 26 | \(s[i]=p[i]\) với mọi \(0\le i\le n-1\). |
| 3 | 13 | \(n\le 50\,000\); tất cả đối thủ có cùng sức mạnh, tức là \(s[i]=s[j]\) với mọi \(0\le i,j\le n-1\). |
| 4 | 12 | \(n\le 50\,000\); có nhiều nhất \(5\) giá trị phân biệt trong các giá trị \(s[i]\) với \(0\le i\le n-1\). |
| 5 | 27 | \(n\le 50\,000\). |
| 6 | 11 | Không có ràng buộc bổ sung. |
Ví dụ
Ví dụ 1
Input
3 2
2 6 9
3 1 2
2 2 3
1 0 1
0 1
2 3
Output
24
25
Note
Xét lời gọi:
init(3, [2, 6, 9], [3, 1, 2], [2, 2, 3], [1, 0, 1])
Sơ đồ trên minh họa lời gọi này. Mỗi ô vuông biểu diễn một ngục tối. Với các ngục tối \(0\), \(1\) và \(2\), các giá trị \(s[i]\) và \(p[i]\) được ghi bên trong ô vuông. Các mũi tên màu tím hồng chỉ nơi anh hùng đi tới sau khi thắng một cuộc đối đầu, còn các mũi tên màu đen chỉ nơi anh hùng đi tới sau khi thua.
Giả sử trình chấm gọi simulate(0, 1). Trò chơi diễn ra như sau:
| Ngục tối | Sức mạnh của anh hùng trước khi đối đầu | Kết quả |
|---|---|---|
| 0 | 1 | Thua |
| 1 | 4 | Thua |
| 0 | 5 | Thắng |
| 2 | 7 | Thua |
| 1 | 9 | Thắng |
| 2 | 15 | Thắng |
| 3 | 24 | Trò chơi kết thúc |
Vì vậy, hàm cần trả về \(24\).
Giả sử trình chấm gọi simulate(2, 3). Trò chơi diễn ra như sau:
| Ngục tối | Sức mạnh của anh hùng trước khi đối đầu | Kết quả |
|---|---|---|
| 2 | 3 | Thua |
| 1 | 5 | Thua |
| 0 | 6 | Thắng |
| 2 | 8 | Thua |
| 1 | 10 | Thắng |
| 2 | 16 | Thắng |
| 3 | 25 | Trò chơi kết thúc |
Vì vậy, hàm cần trả về \(25\).
Nguồn
IOI 2021, Ngày 2 — Dungeons Game (dungeons).
Kỳ thi:
- IOI 2021 - Ngày 2 (25 Tháng sáu, 2021)

Bình luận