APIO 2017

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 APIO 2017 - Koala Game 100 (p) 1.0s 512M
2 APIO 2017 - Travelling Merchant 100 (p) 1.0s 512M
3 APIO 2017 - Land of the Rainbow Gold 100 (p) 2.0s 512M

1. APIO 2017 - Koala Game

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Koala đã tạo ra một trò chơi mới và thách đấu bạn! Cô ấy bắt đầu bằng cách đặt xuống \(N\) vật phẩm, được đánh số từ \(0\) đến \(N-1\). Sau đó, cô bí mật gán cho mỗi vật phẩm một giá trị nguyên từ \(1\) đến \(N\) sao cho không có hai vật phẩm nào nhận cùng một giá trị. Vật phẩm \(i\) có giá trị \(P_i\). Cô thách bạn xác định một số tính chất của dãy giá trị \(P = P_0,P_1,\ldots,P_{N-1}\).

Để làm điều đó, bạn sẽ yêu cầu Koala chơi một số vòng. Trong mỗi vòng, bạn có \(W\) viên đá xanh lam và Koala có \(W\) viên đá đỏ. Bạn đi trước bằng cách đặt một số (có thể là tất cả) đá của mình cạnh những vật phẩm tùy chọn. Sau khi nhìn thấy cách sắp xếp của bạn, Koala cũng đặt một số (có thể là tất cả) đá của cô ấy cạnh các vật phẩm. Koala giành được tất cả các vật phẩm có số đá đỏ đặt cạnh nhiều hơn số đá xanh lam. Koala luôn phân phối đá sao cho tổng giá trị các vật phẩm cô giành được là lớn nhất. Nếu có nhiều cách đạt tổng giá trị lớn nhất, cô chọn cách giành được tổng số vật phẩm lớn nhất. Nếu vẫn còn nhiều cách, cô chọn một cách bất kỳ trong số đó.

Koala rất lười và sẽ ngủ quên nếu bạn yêu cầu cô chơi quá nhiều vòng. Nhiệm vụ của bạn là nhận biết các tính chất trong dãy \(P\) của Koala bằng cách chơi càng ít vòng càng tốt.

Chi tiết cài đặt

Thí sinh được khuyến nghị dùng mã mẫu của ngôn ngữ mình chọn làm điểm bắt đầu. Thí sinh phải cài đặt cả bốn hàm sau, kể cả khi chỉ làm một số subtasks; những hàm không dùng đến có thể để trống. Chương trình không được đọc từ đầu vào chuẩn, ghi ra đầu ra chuẩn hoặc tương tác với bất kỳ tệp nào.

Trong mỗi hàm, tham số N là số vật phẩm và W là số đá mà cả bạn lẫn Koala có trong mỗi vòng.

C++
int minValue(int N, int W);
  • Trả về số hiệu \(i\) của vật phẩm có giá trị nhỏ nhất, tức là \(P_i = 1\).
C++
int maxValue(int N, int W);
  • Trả về số hiệu \(i\) của vật phẩm có giá trị lớn nhất, tức là \(P_i = N\).
C++
int greaterValue(int N, int W);
  • So sánh giá trị của vật phẩm \(0\)\(1\), rồi trả về số hiệu của vật phẩm có giá trị lớn hơn. Cụ thể, trả về \(0\) nếu \(P_0 > P_1\), ngược lại trả về \(1\).
C++
void allValues(int N, int W, int *P);
  • Xác định toàn bộ dãy và ghi vào mảng P: với mọi \(0 \le i \le N-1\), P[i] phải chứa giá trị \(P_i\) của vật phẩm \(i\).
  • Hàm không trả về giá trị.

Trong mỗi testcase, trình chấm gọi chính xác một trong bốn hàm trên một hoặc nhiều lần. Mỗi lời gọi hàm được coi là một ván chơi riêng. Hàm nào được gọi và số lần tối đa hàm đó có thể được gọi phụ thuộc vào subtask. Có thể giả sử Koala đã cố định dãy \(P\) trước mỗi lời gọi hàm và dãy không thay đổi trong suốt lời gọi đó. Cô ấy có thể thay đổi dãy trước lời gọi hàm tiếp theo.

Mỗi hàm do thí sinh cài đặt có thể gọi hàm sau để lấy thông tin về dãy của Koala:

C++
void playRound(int *B, int *R);
  • Hàm này yêu cầu Koala chơi một vòng với bạn và không trả về giá trị.
  • Mảng B mô tả số đá xanh lam bạn đặt cạnh từng vật phẩm. Với mọi \(0 \le i \le N-1\), B[i] viên đá xanh lam được đặt cạnh vật phẩm \(i\). Mỗi B[i] phải là số nguyên không âm và B[0] + B[1] + ... + B[N-1] không được vượt quá \(W\).
  • Trình chấm điền vào mảng R để mô tả câu trả lời của Koala. Với mọi \(0 \le i \le N-1\), Koala đặt R[i] viên đá đỏ cạnh vật phẩm \(i\).
  • Mỗi subtask quy định một giới hạn cứng cho số lần gọi playRound trong mỗi ván. Dùng ít lời gọi hơn giới hạn này có thể đem lại điểm cao hơn.

Phân nhóm

Gọi \(C_{max}\) là số lần gọi playRound lớn nhất trong tất cả các ván của một testcase, và \(C\) là số lần gọi playRound trong ván duy nhất của testcase thuộc Subtask 5.

Subtask Điểm tối đa Hàm được gọi và số lần gọi Điều kiện Giới hạn lời gọi playRound mỗi ván Cách tính điểm
Sample Data 0 Mỗi testcase gọi đúng một trong bốn hàm đúng một lần; có tổng cộng \(5\) testcase mẫu \(N=6\), \(P=(5,3,2,1,6,4)\) 3200 Không tính điểm.
1 4 Chỉ gọi minValue, nhiều nhất \(100\) lần mỗi testcase \(N=100\), \(W=100\) 2 4 điểm nếu đúng.
2 15 Chỉ gọi maxValue, nhiều nhất \(100\) lần mỗi testcase \(N=100\), \(W=100\) 13 15 điểm nếu \(C_{max} \le 4\); 7 điểm nếu \(5 \le C_{max} \le 13\).
3 18 Chỉ gọi greaterValue, nhiều nhất \(1100\) lần mỗi testcase \(N=100\), \(W=100\) 14 18 điểm nếu \(C_{max} \le 3\); 14 điểm nếu \(C_{max}=4\); 11 điểm nếu \(C_{max}=5\); 5 điểm nếu \(6 \le C_{max} \le 14\).
4 10 Chỉ gọi allValues, đúng một lần mỗi testcase \(N=100\), \(W=200\) 700 10 điểm nếu đúng.
5 53 Chỉ gọi allValues, đúng một lần mỗi testcase \(N=100\), \(W=100\) 3200 53 điểm nếu \(C \le 100\); \(\lfloor 53-8\log_2(C/100)\rfloor\) điểm nếu \(101 \le C \le 3200\). Đặc biệt, nếu \(C=3200\) thì được 13 điểm.

Trong công thức trên, \(\lfloor x\rfloor\) là số nguyên lớn nhất không vượt quá \(x\).

Trong mỗi testcase, chương trình phải luôn chạy trong giới hạn thời gian và bộ nhớ. Điều này bao gồm cả thời gian và bộ nhớ mà trình chấm sử dụng khi thiết lập, kết thúc và trả lời các lời gọi playRound. Khi ước lượng phần chi phí này, có thể giả sử trình chấm dùng để chấm có chức năng giống hệt và cách cài đặt tương tự trình chấm mẫu được cung cấp.

Nếu gọi playRound với mảng B không hợp lệ, hoặc số lời gọi playRound vượt giới hạn cứng của bất kỳ ván nào trong testcase, toàn bộ testcase bị chấm Not Correct và nhận \(0\) điểm.

Nếu một hàm không xác định đúng tính chất được yêu cầu của dãy \(P\) trong một ván bất kỳ của testcase, toàn bộ testcase bị chấm Not Correct và nhận \(0\) điểm.

Cả Subtask 4 và Subtask 5 đều yêu cầu cài đặt allValues, nhưng có giá trị \(W\) khác nhau. Có thể dùng điều này để phân biệt hai subtasks trong chương trình.

Bạn được nộp bài tối đa \(60\) lần và khoảng cách giữa hai lần nộp liên tiếp phải ít nhất \(2\) phút.

Ví dụ

Xét dãy \(P\) sau:

\(i\) 0 1 2 3 4 5
\(P_i\) 5 3 2 1 6 4

Dưới đây là một số lời gọi mẫu đến playRound và một câu trả lời hợp lệ của trình chấm cho mỗi lời gọi. Có thể có nhiều hơn một câu trả lời hợp lệ cho một lời gọi playRound.

\(W\) Lời gọi mẫu Câu trả lời có thể của trình chấm Giải thích
6 playRound([0, 3, 0, 2, 1, 0], R) R = [1, 1, 1, 0, 2, 1] Bạn đặt lần lượt ba, hai và một viên đá xanh cạnh các vật phẩm \(1\), \(3\), \(4\), và không đặt đá cạnh các vật phẩm \(0\), \(2\), \(5\). Koala đặt một viên đá đỏ cạnh các vật phẩm \(0\), \(1\), \(2\), \(5\), hai viên cạnh vật phẩm \(4\), và không đặt viên nào cạnh vật phẩm \(3\). Cô giành được các vật phẩm \(0\), \(2\), \(4\), \(5\) với tổng giá trị \(5+2+6+4=17\), là tổng lớn nhất có thể.
6 playRound([1, 2, 3, 1, 2, 0], R) Lời gọi không hợp lệ; chương trình bị dừng và testcase bị chấm Not Correct, nhận \(0\) điểm Bạn đã đặt \(1+2+3+1+2=9>6=W\) viên đá, nên lời gọi không hợp lệ.
12 playRound([1, 2, 3, 1, 2, 0], R) R = [2, 3, 0, 2, 3, 1] Bạn không cần dùng hết \(W\) viên đá xanh và Koala cũng không cần dùng hết \(W\) viên đá đỏ.
6 playRound([0, 1, 0, 0, 1, 0], R) R = [1, 0, 1, 1, 2, 1] Nếu có nhiều câu trả lời giúp Koala đạt tổng giá trị lớn nhất, cô chọn câu trả lời làm số vật phẩm giành được lớn nhất. Vì vậy R = [1, 2, 0, 0, 2, 1] không phải câu trả lời hợp lệ.

Phản hồi cho từng hàm mà trình chấm gọi dưới đây (đúng một hàm trong mỗi testcase) được cung cấp theo thứ tự dưới dạng "Sample Data" khi nộp bài. Trong mỗi testcase này, được gọi playRound nhiều nhất \(3200\) lần.

STT Lời gọi của trình chấm Giá trị trả về mong đợi Giải thích
1 minValue(6, 6) 3 \(P_3=1\), nên vật phẩm \(3\) có giá trị nhỏ nhất.
2 maxValue(6, 6) 4 \(P_4=6=N\), nên vật phẩm \(4\) có giá trị lớn nhất.
3 greaterValue(6, 6) 0 \(P_0=5>3=P_1\), nên vật phẩm \(0\) có giá trị lớn hơn vật phẩm \(1\).
4 allValues(6, 12, P) Không có; P = [5, 3, 2, 1, 6, 4] allValues không trả về giá trị mà ghi các giá trị đúng vào mảng P.
5 allValues(6, 6, P) Không có; P = [5, 3, 2, 1, 6, 4] Giống lời gọi trước.

Trình chấm mẫu

Trình chấm mẫu đọc dữ liệu vào theo định dạng sau:

  • Dòng \(1\): hai số nguyên \(F\), \(G\).
  • Các dòng từ \(2\) đến \(G+1\): mỗi dòng chứa hai số nguyên \(N\), \(W\), theo sau bởi \(N\) số nguyên \(P_0,P_1,\ldots,P_{N-1}\) mô tả một ván.

Số nguyên \(F\) xác định hàm mà trình chấm mẫu sẽ gọi:

\(F\) Hàm được gọi
1 minValue
2 maxValue
3 greaterValue
4 allValues

Số nguyên \(G\) xác định số lần gọi hàm đã chọn. Mỗi dòng sau đó mô tả một ván với dãy của Koala.

Với mỗi lời gọi hàm, trình chấm mẫu ghi hai dòng ra đầu ra chuẩn. Dòng đầu chứa số lần gọi playRound.

  • Nếu \(F=4\), dòng thứ hai chứa nội dung mà hàm allValues đã ghi vào mảng P.
  • Nếu \(F=1\), \(2\) hoặc \(3\), dòng thứ hai chứa một số nguyên duy nhất là giá trị trả về của hàm tương ứng.

Ví dụ, testcase thứ tư trong "Sample Data", gọi allValues với \(N=6\)\(W=12\), có thể được mô tả bằng tệp đầu vào mẫu sau:

Ví dụ 1

Input
4 1
6 12 5 3 2 1 6 4

Nguồn

Đề bài chính thức của Ban tổ chức APIO 2017: Koala Game.

2. APIO 2017 - Travelling Merchant

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Sau nhiều ngày băng qua vùng hoang dã rộng lớn của nước Úc, cuối cùng bạn đã đến thành phố Cobar tráng lệ với hành trang chỉ là một chiếc ba lô nhỏ. Say mê trước vẻ đẹp và sự kỳ diệu của các khu chợ nơi đây, bạn quyết định trở thành một thương gia và chọn Cobar làm quê hương mới. Cobar có \(N\) khu chợ, được đánh số từ \(1\) đến \(N\), nối với nhau bởi \(M\) đường đi bộ một chiều, mỗi đường cần một số phút nhất định để đi qua.

Các khu chợ ở Cobar giao dịch \(K\) mặt hàng khác nhau, được đánh số từ \(1\) đến \(K\). Mỗi khu chợ có một mức giá cố định để mua hoặc bán từng mặt hàng. Không phải khu chợ nào cũng giao dịch mọi mặt hàng; với một mặt hàng nhất định, một khu chợ có thể chỉ cho phép mua mà không cho phép bán, hoặc ngược lại. Có thể giả sử mỗi khu chợ bán một mặt hàng nào đó luôn có số lượng vô hạn, và tương tự, nếu một khu chợ muốn mua một mặt hàng thì khu chợ đó sẵn sàng mua đi mua lại mãi mãi.

Để kiếm tiền nhanh nhất có thể, bạn muốn tìm một chu trình sinh lời hiệu quả nhất. Một chu trình sinh lời là một hành trình trong Cobar, bắt đầu tại một khu chợ \(v\) với ba lô rỗng, tiếp tục dọc theo các đường đi bộ và qua các khu chợ của Cobar (có thể mua và bán các mặt hàng trên đường đi), rồi cuối cùng quay lại \(v\) với ba lô lại rỗng. Hành trình có thể ghé một khu chợ và/hoặc đi qua một đường đi bộ nhiều lần. Khi mua một mặt hàng, bạn phải lập tức đặt nó vào ba lô; vì ba lô nhỏ nên tại mọi thời điểm nó chỉ có thể chứa tối đa một mặt hàng. Có thể giả sử rằng bạn luôn mua được một mặt hàng nếu mặt hàng đó có bán, bất kể số tiền hiện có của bạn, và bạn không được phép bán một mặt hàng mà mình không sở hữu.

Lợi nhuận của một chu trình như vậy bằng tổng số tiền thu được từ việc bán hàng trừ đi tổng số tiền đã chi để mua hàng. Thời lượng của chu trình là tổng số phút đi bộ trên các đường đi tạo nên chu trình. Hiệu suất của một chu trình sinh lời bằng lợi nhuận của nó chia cho thời lượng. Lưu ý rằng một chu trình sinh lời không mua hoặc bán bất kỳ mặt hàng nào có hiệu suất bằng \(0\).

Nhiệm vụ của bạn là tìm hiệu suất lớn nhất trong tất cả các chu trình sinh lời có thời lượng dương. Hãy ghi giá trị này sau khi làm tròn xuống số nguyên gần nhất. Nếu không tồn tại chu trình sinh lời như vậy, hãy ghi \(0\).

Dữ liệu vào

Dòng đầu tiên chứa ba số nguyên \(N\), \(M\)\(K\): lần lượt là số khu chợ, số đường đi bộ và số mặt hàng.

\(N\) dòng tiếp theo mô tả các khu chợ. Dòng thứ \(i\) chứa \(2K\) số nguyên \(B_{i,1}, S_{i,1}, B_{i,2}, S_{i,2}, \ldots, B_{i,K}, S_{i,K}\). Với mọi \(1 \le j \le K\), cặp số nguyên \(B_{i,j}\)\(S_{i,j}\) lần lượt mô tả mức giá mà bạn có thể mua và bán mặt hàng \(j\) tại khu chợ \(i\). Nếu không thể mua hoặc bán một mặt hàng, giá trị tương ứng được thay bằng \(-1\).

\(M\) dòng tiếp theo mô tả các đường đi bộ. Dòng thứ \(p\) chứa ba số nguyên \(V_p\), \(W_p\)\(T_p\), mô tả một đường đi bộ một chiều từ khu chợ \(V_p\) đến khu chợ \(W_p\), cần \(T_p\) phút để đi qua.

Dữ liệu ra

In ra một số nguyên duy nhất là hiệu suất lớn nhất trong tất cả các chu trình sinh lời, được làm tròn xuống số nguyên gần nhất.

Phân nhóm

Trong tất cả các subtasks:

  • \(1 \le N \le 100\);
  • \(1 \le M \le 9900\);
  • \(1 \le K \le 1000\);
  • với mọi mặt hàng có thể được mua/bán, \(0 \le S_{i,j} \le B_{i,j} \le 1\,000\,000\,000\) với mọi \(1 \le i \le N\)\(1 \le j \le K\);
  • \(V_p \ne W_p\)\(1 \le T_p \le 10\,000\,000\) với mọi \(1 \le p \le M\);
  • không tồn tại hai cạnh \(1 \le p < q \le M\) sao cho \((V_p, W_p) = (V_q, W_q)\).
Subtask Điểm Ràng buộc bổ sung Mô tả
1 12 \(B_{i,j} = -1\) với mọi \(2 \le i \le N\) và mọi \(1 \le j \le K\) Chỉ có thể mua mặt hàng tại khu chợ \(1\).
2 21 \(N \le 50\), \(K \le 50\)\(T_p = 1\) với mọi \(1 \le p \le M\) Mọi đường đi bộ đều cần \(1\) phút để đi qua.
3 33 \(B_{i,j} = S_{i,j} \ne -1\) với mọi \(1 \le i \le N\) và mọi \(1 \le j \le K\) Mỗi khu chợ đều mua bán mọi mặt hàng; tại một khu chợ, giá mua và giá bán của một mặt hàng bằng nhau (nhưng có thể khác nhau giữa các khu chợ).
4 34 Không có Không có ràng buộc bổ sung.

Ví dụ

Phản hồi cho ví dụ sau sẽ được cung cấp dưới dạng "Sample Data" khi nộp bài.

Ví dụ 1

Input
4 5 2
10 9 5 2
6 4 20 15
9 7 10 9
-1 -1 16 11
1 2 3
2 3 3
1 4 1
4 3 1
3 1 1
Output
2

Giải thích

Trong ví dụ, xét hai chu trình "1 đến 2 đến 3 đến 1" và "1 đến 4 đến 3 đến 1".

Với chu trình "1 đến 2 đến 3 đến 1", thời gian đi hết chu trình là \(7\) phút, bằng \(3 + 3 + 1\). Cách giao dịch có lợi nhất trên chu trình này là mua mặt hàng \(2\) tại khu chợ \(1\) (tốn \(5\)), bán nó tại khu chợ \(2\) (thu \(15\)), ngay lập tức mua mặt hàng \(1\) tại khu chợ \(2\) (tốn \(6\)), mang mặt hàng \(1\) qua khu chợ \(3\), rồi bán nó tại khu chợ \(1\) (thu \(9\)). Vì vậy lợi nhuận trên chu trình này là \(-5 + 15 - 6 + 9 = 13\). Giá trị \(13/7\) làm tròn xuống cho hiệu suất bằng \(1\).

Với chu trình "1 đến 4 đến 3 đến 1", thời gian đi hết chu trình là \(3\) phút, bằng \(1 + 1 + 1\). Cách giao dịch có lợi nhất trên chu trình này là mua mặt hàng \(2\) tại khu chợ \(1\) (tốn \(5\)), bán nó tại khu chợ \(4\) (thu \(11\)), rồi đi qua khu chợ \(3\) và trở lại khu chợ \(1\). Vì vậy lợi nhuận trên chu trình này là \(-5 + 11 = 6\). Giá trị \(6/3\) làm tròn xuống cho hiệu suất bằng \(2\).

Do đó, hiệu suất tốt nhất của một chu trình sinh lời tại Cobar là \(2\).

Nguồn

Đề bài chính thức của Ban tổ chức APIO 2017: Travelling Merchant.

3. APIO 2017 - Land of the Rainbow Gold

Điểm: 100 (p) Thời gian: 2.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Ngày xửa ngày xưa, trong Thời Đại Mộng Mơ, nước Úc là một lưới phẳng gồm \(R\) hàng và \(C\) cột, và mỗi ô lưới đều là đất. Các hàng được đánh số từ \(1\) đến \(R\) theo hướng Bắc xuống Nam, còn các cột được đánh số từ \(1\) đến \(C\) theo hướng Tây sang Đông. Ô ở hàng \(r\), cột \(c\) được ký hiệu là \((r,c)\). Một ngày nọ, con rắn cầu vồng vĩ đại trồi lên từ mặt đất tại \((s_r,s_c)\) rồi trườn khắp nước Úc, tạo ra sông ở mọi nơi nó đi qua. Con rắn thực hiện \(M\) bước di chuyển liên tiếp; tại mỗi bước, nó đi đến ô kề ngay phía Bắc (N), Nam (S), Đông (E) hoặc Tây (W) và biến ô đó thành sông. Ô \((s_r,s_c)\) cũng được biến thành sông.

Hàng triệu năm sau, bạn muốn mua một khối ô hình chữ nhật để tưởng niệm việc con rắn cầu vồng tạo ra những dòng sông. Bạn sẽ chọn một màu cho mỗi ô đất bên trong khối chữ nhật. Bạn muốn sử dụng nhiều màu khác nhau nhất có thể, nhưng yêu cầu mọi cặp ô đất kề nhau bên trong khối đều có cùng màu. Hai ô được coi là kề nhau nếu chúng có chung một cạnh. Bạn không tô màu cho bất kỳ ô đất nào bên ngoài khối, cũng không tô màu cho các ô sông bên trong khối.

Biết các bước di chuyển của con rắn cầu vồng, với mỗi trong số \(Q\) khối ô hình chữ nhật, hãy xác định số màu khác nhau lớn nhất có thể dùng để tô các ô đất.

Chi tiết cài đặt

Thí sinh phải cài đặt hai hàm sau:

C++
void init(int R, int C, int sr, int sc, int M, char *S);
  • Trình chấm gọi hàm này đầu tiên và đúng một lần.
  • R, C: số hàng và số cột của lưới.
  • sr, sc: hàng và cột nơi con rắn trồi lên từ mặt đất.
  • M: số bước di chuyển của con rắn.
  • S: chuỗi độ dài \(M\); với mọi \(0 \le i \le M - 1\), S[i] là một trong các ký tự N, S, E, W, cho biết bước thứ \(i\) của con rắn đi đến ô kề ngay phía Bắc, Nam, Đông hoặc Tây so với vị trí hiện tại. Có thể giả sử con rắn không bao giờ rời khỏi lưới.
  • Hàm này không trả về giá trị.
C++
int colour(int ar, int ac, int br, int bc);
  • Sau khi gọi init một lần, trình chấm gọi hàm này liên tiếp đúng \(Q\) lần.
  • ar, ac: hàng và cột của góc Tây Bắc của khối chữ nhật.
  • br, bc: hàng và cột của góc Đông Nam của khối chữ nhật.
  • Có thể giả sử \(1 \le ar \le br \le R\)\(1 \le ac \le bc \le C\).
  • Hàm phải trả về một số nguyên duy nhất: số màu khác nhau lớn nhất có thể dùng cho các ô đất trong khối chữ nhật từ góc Tây Bắc \((ar,ac)\) đến góc Đông Nam \((br,bc)\) theo các quy tắc trên.

Hãy tham khảo các tệp mã mẫu được cung cấp để biết thêm chi tiết về cách cài đặt lời giải bằng ngôn ngữ lập trình đã chọn.

Trình chấm mẫu

Trình chấm mẫu đọc dữ liệu vào theo định dạng sau:

  • Dòng \(1\): bốn số nguyên \(R\), \(C\), \(M\)\(Q\).
  • Dòng \(2\): hai số nguyên \(s_r\)\(s_c\).
  • Dòng \(3\): chuỗi \(S\) gồm \(M\) ký tự, mỗi ký tự là N, S, E hoặc W; để trống dòng này nếu \(M = 0\).
  • Các dòng từ \(4\) đến \(Q + 3\): bốn số nguyên \(a_r\), \(a_c\), \(b_r\)\(b_c\).

Phiên làm việc mẫu và giải thích

Lời gọi mô-đun Giá trị trả về Giải thích
init(6, 4, 3, 3, 9, "NWESSWEWS") Không có Mô-đun cung cấp cho chương trình kích thước lưới, vị trí bắt đầu của con rắn và các bước di chuyển của nó. Hàm không trả về giá trị.
colour(2, 3, 2, 3) 0 Ô duy nhất trong hình chữ nhật này là \((2,3)\), một ô sông. Vì vậy không có ô đất nào để tô màu.
colour(3, 2, 4, 4) 2 Dòng sông chia các ô đất thành hai miền: miền thứ nhất chứa ô \((3,2)\); miền thứ hai chứa các ô \((3,4)\)\((4,4)\). Vì vậy số màu khác nhau lớn nhất có thể dùng là \(2\).
colour(5, 3, 6, 4) 1 Mọi ô trong hình chữ nhật này đều là ô đất. Vì tất cả các ô đất liên thông nên số màu khác nhau lớn nhất có thể dùng là \(1\).
colour(1, 2, 5, 3) 3 Dòng sông chia các ô đất thành ba miền: miền thứ nhất chứa các ô \((1,2)\)\((1,3)\); miền thứ hai chứa ô \((3,2)\); miền thứ ba chứa ô \((5,3)\). Vì vậy số màu khác nhau lớn nhất có thể dùng là \(3\).

Các hình sau tương ứng với phiên làm việc mẫu trên. Những ô màu xanh lam có hoa văn là ô sông.

{{asset:apio17rainbow/sample-diagrams.png}}

Ví dụ 1

Input
6 4 9 4
3 3
NWESSWEWS
2 3 2 3
3 2 4 4
5 3 6 4
1 2 5 3
Output
0
2
1
3

Phản hồi cho testcase mẫu này sẽ được cung cấp dưới dạng "Sample Data" khi nộp bài.

Phân nhóm

Trong tất cả các subtasks, \(0 \le M \le 100\,000\)\(R,C,Q \ge 1\).

Subtask Điểm \(R\) \(C\) \(Q\)
1 11 \(R \le 50\) \(C \le 50\) \(Q \le 1000\)
2 12 \(R = 2\) \(C \le 200\,000\) \(Q \le 100\,000\)
3 24 \(R = 200\,000\) \(C = 200\,000\) \(Q = 1\)
4 27 \(R = 1000\) \(C = 1000\) \(Q = 100\,000\)
5 26 \(R = 200\,000\) \(C = 200\,000\) \(Q = 100\,000\)

Nguồn

Đề bài chính thức của Ban tổ chức APIO 2017: Land of the Rainbow Gold.