IOI 2020 - Comparing Plants
Xem PDFNhà thực vật học Hazel đến tham quan một triển lãm đặc biệt tại Vườn Bách thảo Singapore. Trong triển lãm, \(n\) cây có chiều cao đôi một khác nhau được đặt trên một vòng tròn. Các cây được gán nhãn từ \(0\) đến \(n-1\) theo chiều kim đồng hồ, với cây \(n-1\) nằm bên cạnh cây \(0\).
Với mỗi cây \(i\) (\(0 \le i \le n-1\)), Hazel so sánh cây \(i\) với từng cây trong \(k-1\) cây kế tiếp theo chiều kim đồng hồ, rồi ghi lại số \(r[i]\) là số cây cao hơn cây \(i\) trong số \(k-1\) cây đó. Như vậy, mỗi giá trị \(r[i]\) phụ thuộc vào tương quan chiều cao của một số cây liên tiếp.
Ví dụ, giả sử \(n=5\), \(k=3\) và \(i=3\). Khi đó, \(k-1=2\) cây kế tiếp theo chiều kim đồng hồ tính từ cây \(i=3\) là cây \(4\) và cây \(0\). Nếu cây \(4\) cao hơn cây \(3\) và cây \(0\) thấp hơn cây \(3\), Hazel sẽ ghi lại \(r[3]=1\).
Bạn có thể giả sử Hazel đã ghi các giá trị \(r[i]\) chính xác. Do đó, tồn tại ít nhất một cách gán các chiều cao đôi một khác nhau cho các cây phù hợp với những giá trị này.
Bạn được yêu cầu so sánh chiều cao của \(q\) cặp cây. Đáng tiếc, bạn không thể đến triển lãm. Nguồn thông tin duy nhất của bạn là sổ ghi chép của Hazel, chứa giá trị \(k\) và dãy \(r[0],\ldots,r[n-1]\).
Với mỗi cặp cây khác nhau \(x\) và \(y\) cần so sánh, hãy xác định trường hợp nào trong ba trường hợp sau xảy ra:
- Cây \(x\) chắc chắn cao hơn cây \(y\): với mọi cách gán chiều cao đôi một khác nhau \(h[0],\ldots,h[n-1]\) phù hợp với mảng \(r\), luôn có \(h[x]>h[y]\).
- Cây \(x\) chắc chắn thấp hơn cây \(y\): với mọi cách gán chiều cao đôi một khác nhau \(h[0],\ldots,h[n-1]\) phù hợp với mảng \(r\), luôn có \(h[x]<h[y]\).
- Không thể kết luận: không thuộc trường hợp nào trong hai trường hợp trên.
Chi tiết cài đặt
Bạn cần cài đặt các hàm C++ sau:
void init(int k, std::vector<int> r);
- \(k\): số cây liên tiếp có chiều cao quyết định mỗi giá trị \(r[i]\).
- \(r\): mảng kích thước \(n\), trong đó \(r[i]\) là số cây cao hơn cây \(i\) trong \(k-1\) cây kế tiếp theo chiều kim đồng hồ.
- Hàm này được gọi đúng một lần, trước mọi lời gọi
compare_plants.
int compare_plants(int x, int y);
- \(x\), \(y\): nhãn của hai cây cần so sánh.
- Hàm phải trả về \(1\) nếu cây \(x\) chắc chắn cao hơn cây \(y\); \(-1\) nếu cây \(x\) chắc chắn thấp hơn cây \(y\); \(0\) nếu không thể kết luận.
- 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 k q. - Dòng \(2\):
r[0] r[1] ... r[n-1]. - Dòng \(3+i\) (\(0 \le i \le q-1\)):
x ycho lời gọicompare_plantsthứ \(i\) (đánh số từ \(0\)).
Dữ liệu ra
Trình chấm mẫu in trên dòng \(1+i\) (\(0 \le i \le q-1\)) giá trị trả về của lời gọi compare_plants thứ \(i\).
Ràng buộc
- \(2 \le k \le n \le 200\,000\).
- \(1 \le q \le 200\,000\).
- \(0 \le r[i] \le k-1\) (\(0 \le i \le n-1\)).
- \(0 \le x < y \le n-1\).
Tồn tại ít nhất một cách gán các chiều cao đôi một khác nhau cho các cây phù hợp với mảng \(r\).
Phân nhóm
| Nhóm | Điểm | Ràng buộc bổ sung |
|---|---|---|
| 1 | 5 | \(k=2\). |
| 2 | 14 | \(n \le 5000\) và \(2\cdot k>n\). |
| 3 | 13 | \(2\cdot k>n\). |
| 4 | 17 | Đáp án đúng của mỗi lời gọi compare_plants là \(1\) hoặc \(-1\). |
| 5 | 11 | \(n \le 300\) và \(q \le \frac{n\cdot(n-1)}{2}\). |
| 6 | 15 | \(x=0\) trong mỗi lời gọi compare_plants. |
| 7 | 25 | Không có ràng buộc bổ sung. |
Ví dụ
Ví dụ 1
Lời gọi
init(3, [0, 1, 1, 2])
Note
Giả sử trình chấm gọi compare_plants(0, 2). Vì \(r[0]=0\), ta suy ra ngay cây \(2\) không cao hơn cây \(0\). Do đó, lời gọi phải trả về \(1\).
Giả sử tiếp theo trình chấm gọi compare_plants(1, 2). Trong mọi cách gán chiều cao phù hợp với các ràng buộc trên, cây \(1\) thấp hơn cây \(2\). Do đó, lời gọi phải trả về \(-1\).
Ví dụ 2
Lời gọi
init(2, [0, 1, 0, 1])
Note
Giả sử trình chấm gọi compare_plants(0, 3). Vì \(r[3]=1\), ta biết cây \(0\) cao hơn cây \(3\). Do đó, lời gọi phải trả về \(1\).
Giả sử tiếp theo trình chấm gọi compare_plants(1, 3). Hai cách gán chiều cao \([3,1,4,2]\) và \([3,2,4,1]\) đều phù hợp với các phép đo của Hazel. Cây \(1\) thấp hơn cây \(3\) trong một cách gán và cao hơn cây \(3\) trong cách gán còn lại, nên lời gọi phải trả về \(0\).
Nguồn
IOI 2020, Ngày 1 — Comparing Plants (plants). Đề chính thức tiếng Anh và bản dịch tiếng Việt.
Kỳ thi:
- IOI 2020 - Ngày 1 (19 Tháng 9., 2020)
Bình luận