Google Code Jam 2022 - Round 3

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2022 - Duck, Duck, Geese 25 4.0s 1G
2 Google Code Jam 2022 - Mascot Maze 25 20.0s 1G
3 Google Code Jam 2022 - Revenge of GoroSort 100 3.0s 1G
4 Google Code Jam 2022 - Win As Second 100 1.0s 1G

1. Google Code Jam 2022 - Duck, Duck, Geese

Điểm: 25 Thời gian: 4.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Trong trò chơi “Duck, Duck, Goose”, mọi người chơi trừ một người ngồi dưới sàn thành vòng tròn. Người còn lại đi quanh vòng, gọi từng người là “duck” cho tới khi chọn một người đang ngồi, chạm vào đầu họ và gọi là “goose”. Từ đó, “goose” đuổi theo người chọn và câu chuyện của trò chơi không còn liên quan tới bài này nữa.

Trong trò chơi mới “Duck, Duck, Geese”, người đi quanh thay vào đó chọn một đoạn liên tiếp gồm ít nhất hai, nhưng không phải tất cả, người đang ngồi làm “geese”. Hơn nữa, mỗi người đang ngồi đội một chiếc mũ. Mỗi mũ mang một trong \(C\) màu, đánh số từ \(1\) tới \(C\).

Với mỗi màu \(i\), số “geese” được chọn đang đội mũ màu \(i\) phải bằng \(0\), hoặc nằm trong đoạn \([A_i,B_i]\).

Hãy đếm số lựa chọn thỏa các yêu cầu. Hai lựa chọn được xem là khác nhau nếu tồn tại một người thuộc lựa chọn này nhưng không thuộc lựa chọn kia.

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Mỗi bộ test bắt đầu bằng hai số nguyên \(N,C\): số người đang ngồi và số màu mũ. Tiếp theo là \(C\) dòng; dòng thứ \(i\) chứa hai số nguyên \(A_i,B_i\) như mô tả trên. Dòng cuối chứa \(N\) số nguyên \(P_1,P_2,\ldots,P_N\), nghĩa là người thứ \(j\) theo chiều kim đồng hồ, bắt đầu từ một người tùy ý, đội mũ màu \(P_j\).

Dữ liệu ra

Với mỗi bộ test, in Case #x: y, trong đó \(x\) là số thứ tự bộ test, bắt đầu từ \(1\), và \(y\) là số đoạn liên tiếp gồm ít nhất \(2\) và nhiều nhất \(N-1\) người thỏa mọi yêu cầu về màu.

Ràng buộc

  • \(1\le T\le100\).
  • \(2\le C\le N\).
  • \(0\le A_i\le B_i\le N\) với mọi \(i\).
  • \(1\le P_j\le C\) với mọi \(j\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(3\le N\le1000\).
  • Test Set 2 (phán quyết ẩn): \(3\le N\le10^5\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 12/25 48%
Test Set 2 13/25 52%

Ví dụ

Ví dụ 1

Input
3
3 2
1 1
1 1
1 1 2
5 2
1 1
1 2
1 2 1 2 2
3 3
1 2
1 2
2 2
1 1 3
Output
Case #1: 2
Case #2: 9
Case #3: 1
Giải thích

Trong test mẫu số 1, tổng số người được chọn làm geese phải là \(2\). Chỉ có ba cách chọn hai người, với cấu hình màu \([1,1]\), \([1,2]\), \([2,1]\). Cấu hình đầu có hai người đội màu \(1\) nên không hợp lệ; hai cấu hình còn lại hợp lệ. Đáp án là \(2\).

Test mẫu số 2 là hình trong đề, với màu \(1\) là vàng và màu \(2\) là xanh dương. Tổng số geese phải từ \(2\) tới \(3\), vì chọn \(4\) sẽ khiến ít nhất một màu vượt giới hạn. Với hai geese, yêu cầu duy nhất là không chọn hai người đều đội màu \(1\); cả năm lựa chọn như vậy đều hợp lệ. Với ba geese, các cấu hình là \([1,2,1]\), \([2,1,2]\), \([1,2,2]\), \([2,2,1]\)\([2,1,2]\). Tất cả trừ cấu hình đầu đều hợp lệ, thêm bốn lựa chọn, tổng cộng \(9\).

Test mẫu số 3 cho thấy có thể tồn tại màu mũ không ai đội. Ở đây chỉ có một người đội màu \(3\), mà \(1\) không thuộc khoảng hợp lệ, nên cách hợp lệ duy nhất là chọn \(0\) người đội màu đó.

Nguồn

Google Code Jam 2022, Vòng 3, bài Duck, Duck, Geese.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

2. Google Code Jam 2022 - Mascot Maze

Điểm: 25 Thời gian: 20.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Đội ngũ Google Coding Competitions đang xây dựng một công viên chủ đề mới. Như mọi công viên tốt khác, họ muốn có các diễn viên hóa trang thành linh vật để tương tác với khách. Vì cần mở cửa gấp, họ quyết định dùng các chữ cái trong CODE JAM, KICK STARTHASH CODE làm linh vật, tổng cộng \(13\) linh vật khác nhau: ACDEHIJKMORST.

Điểm vui chơi duy nhất của công viên là một mê cung gồm \(N\) phòng, đánh số từ \(1\) đến \(N\). Mỗi phòng có một lối ra bên trái và một lối ra bên phải; mỗi lối dẫn khách tới một phòng khác. Không thể đi ngược chiều một lối ra. Chẳng hạn, nếu phòng \(2\) có lối sang phòng \(3\), khách không thể từ phòng \(3\) quay lại phòng \(2\), trừ khi chính phòng \(3\) cũng có một lối dẫn tới phòng \(2\).

Ta muốn đặt đúng một trong \(13\) linh vật vào mỗi phòng. Mỗi chữ cái có thể xuất hiện ở không phòng nào, một phòng hoặc nhiều phòng. Để tăng tính đa dạng, mọi ba phòng, không nhất thiết phân biệt, mà một du khách có thể ghé liên tiếp phải có ba linh vật khác nhau.

Hãy chọn linh vật cho mỗi phòng sao cho đạt mục tiêu, hoặc cho biết điều đó không thể thực hiện.

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Mỗi bộ test gồm ba dòng. Dòng đầu chứa số nguyên \(N\), số phòng trong mê cung. Dòng thứ hai chứa \(N\) số nguyên \(L_1,L_2,\ldots,L_N\), nghĩa là lối trái từ phòng \(i\) dẫn tới phòng \(L_i\). Dòng cuối chứa \(N\) số nguyên \(R_1,R_2,\ldots,R_N\), nghĩa là lối phải từ phòng \(i\) dẫn tới phòng \(R_i\).

Dữ liệu ra

Với mỗi bộ test, in Case #x: y, trong đó \(x\) là số thứ tự bộ test, bắt đầu từ \(1\). Nếu không thể gán linh vật tuân thủ các quy tắc, \(y\)IMPOSSIBLE. Nếu có thể, \(y\) là chuỗi dài \(N\); ký tự thứ \(i\) phải là một chữ hoa trong ACDEHIJKMORST, chỉ linh vật đặt ở phòng \(i\).

Ràng buộc

  • \(1\le T\le100\).
  • \(L_i\ne i\)\(R_i\ne i\) với mọi \(i\).
  • \(1\le L_i<R_i\le N\) với mọi \(i\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(3\le N\le100\).
  • Test Set 2 (phán quyết ẩn): \(3\le N\le10^5\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 12/25 48%
Test Set 2 13/25 52%

Ví dụ

Ví dụ 1

Input
4
3
2 1 1
3 3 2
6
3 1 4 1 2 3
5 3 5 2 4 5
20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 1
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20 2
19
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 1
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 19 3
Output
Case #1: IMPOSSIBLE
Case #2: TSHIRT
Case #3: HCJKSHCJKSHCJKSHCJKS
Case #4: CODEJAMROCKSTHEMOST
Giải thích

Test mẫu số 1 chính là hình trong đề. Có thể lần lượt ghé phòng \(1\), \(2\), rồi \(1\) một lần nữa, nên phòng \(1\) sẽ buộc phải mang linh vật khác chính nó; vì vậy test này bất khả thi.

Test mẫu số 2 có bố trí như hình dưới, trong đó mũi tên xanh biểu diễn lối trái và mũi tên đỏ biểu diễn lối phải.

Một trong nhiều đáp án hợp lệ là gán linh vật như hình. Dù không cần đặt hai linh vật T trong test này, đáp án vẫn làm vậy mà không vi phạm quy tắc.

Test mẫu số 3 và 4 đều khả thi, nhưng đòi hỏi dùng nhiều bản sao của một số linh vật.

Nguồn

Google Code Jam 2022, Vòng 3, bài Mascot Maze.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

3. Google Code Jam 2022 - Revenge of GoroSort

Điểm: 100 Thời gian: 3.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Trong bài này, khi một đối tượng được nói là chọn ngẫu nhiên, nghĩa là nó được chọn đều trong mọi khả năng hợp lệ và độc lập với mọi lựa chọn khác.

Các thí sinh Code Jam từng giúp Goro hùng mạnh sắp xếp một mảng số nguyên. Bạn không cần đọc bài đó để giải bài này. Một lần nữa, Goro cần bạn giúp. Goro có \(N\) chiếc hộp đặt thành một hàng trên bàn, đánh số từ \(1\) tới \(N\) theo chiều trái sang phải. Mỗi hộp chứa đúng một quả bóng; các bóng cũng được đánh số từ \(1\) tới \(N\). Goro muốn bóng \(i\) nằm trong hộp \(i\) với mọi \(i\), tức muốn các bóng ở thứ tự đã sắp xếp. Tiếc rằng ban đầu chúng không ở thứ tự đó.

Khi Goro đập chiếc bàn bằng nắm đấm đầy uy lực, các quả bóng bật lên rồi rơi trở lại vào hộp. Goro có thể làm chính xác tới mức mỗi hộp nhận đúng một bóng. Một quả bóng có thể rơi lại hộp cũ hoặc sang hộp khác.

Tuyệt hơn nữa, trước mỗi lần đập, Goro có thể gán màu cho các hộp. Sau đó, anh đập bàn sao cho bóng bay ra từ hộp màu \(c\) luôn rơi vào một hộp màu \(c\). Dù khả năng này rất ấn tượng, Goro không điều khiển được gì thêm: bên trong mỗi nhóm màu, các bóng được gán ngẫu nhiên vào các hộp.

Chẳng hạn, giả sử bóng xuất hiện theo thứ tự \(1,4,3,6,5,2\) như hình. Goro có thể chọn — không nhất thiết tối ưu — tô hộp thứ nhất màu đỏ, hộp thứ hai và thứ sáu màu xanh lá, hộp thứ ba tới thứ năm màu xanh dương. Sau khi Goro đập bàn:

  • Bóng \(1\) trong hộp thứ nhất rơi lại chính hộp đó vì đây là hộp đỏ duy nhất.
  • Hai bóng \(4\)\(2\) trong hộp thứ hai và thứ sáu giữ nguyên vị trí với xác suất \(1/2\), và đổi chỗ với xác suất \(1/2\).
  • Ba bóng \(3,6,5\) trong hộp thứ ba, tư, năm nhận một trong sáu thứ tự sau, mỗi thứ tự có xác suất \(1/6\): \(3,6,5\); \(3,5,6\); \(6,3,5\); \(6,5,3\); \(5,3,6\); \(5,6,3\).

Vì thế, chẳng hạn, xác suất một lần đập để lại thứ tự \(1,2,3,5,6,4\)\(1/12\). Nếu Goro nhận kết quả này hoặc một kết quả chưa sắp xếp khác, anh phải chỉ định một bộ màu hộp cho lượt kế tiếp, rồi tiếp tục cho tới khi cuối cùng đạt \(1,2,3,4,5,6\). Trước mỗi lần đập, Goro có thể gán màu theo bất kỳ cách nào, không phụ thuộc những lần gán trước.

Hãy giúp Goro cài đặt một chiến lược tốt hơn để sắp xếp bóng hiệu quả. Dữ liệu bảo đảm thứ tự ban đầu của bóng là một hoán vị chưa sắp được chọn ngẫu nhiên.

Dữ liệu vào

Đây là bài tương tác. Hãy bảo đảm bạn đã đọc phần Interactive Problems trong FAQ của Google Code Jam.

Ban đầu, chương trình đọc một dòng chứa ba số nguyên \(T,N,K\): số bộ test, số hộp trong mỗi bộ test và tổng số lần đập được phép trên tất cả bộ test. Sau đó phải xử lý \(T\) bộ test.

Dữ liệu ra

Chương trình phải gửi các phép gán màu theo giao thức tương tác bên dưới và kết thúc đúng thời điểm. Sau mỗi lần in dữ liệu, phải đẩy bộ đệm đầu ra.

Giao thức tương tác

Mỗi bộ test bắt đầu khi bộ chấm gửi một dòng gồm \(N\) số nguyên, trong đó mỗi số từ \(1\) tới \(N\) xuất hiện đúng một lần. Danh sách được chọn ngẫu nhiên trong tất cả danh sách chưa sắp. Sau đó, chương trình thực hiện một chuỗi lượt tương tác với bộ chấm.

Trong mỗi lượt tương tác:

  • Chương trình gửi một dòng gồm \(N\) số nguyên \(C_1,C_2,\ldots,C_N\), mỗi số thuộc \([1,N]\). \(C_i\) nghĩa là gán màu \(C_i\) cho hộp \(i\) trong lần đập tiếp theo. Bạn được tự chọn số màu và cách đánh số màu, nhưng phải gán màu cho mọi hộp.
  • Bộ chấm mô phỏng lần đập như đề mô tả. Nếu kết quả đã sắp xếp:
  • Nếu đây là lượt tương tác thứ \(K\) tính trên tất cả bộ test và chưa phải bộ test cuối, bộ chấm gửi một dòng chứa \(-1\) rồi không xuất gì thêm.
  • Nếu không, bộ chấm gửi một dòng chứa \(1\), rồi lập tức bắt đầu bộ test kế tiếp nếu còn. Nếu đây là bộ test cuối, chương trình phải kết thúc không lỗi và không gửi thêm gì.
  • Nếu bóng vẫn chưa được sắp:
  • Nếu đây là lượt tương tác thứ \(K\) trên tất cả bộ test, hoặc chương trình gửi dòng không hợp lệ, chẳng hạn thiếu số hoặc màu ngoài miền, bộ chấm gửi một dòng chứa \(-1\) rồi không xuất gì thêm.
  • Nếu chưa phải lượt thứ \(K\), bộ chấm gửi một dòng chứa \(0\), sau đó một dòng gồm \(N\) số nguyên tạo thành một hoán vị chưa sắp của \(1,\ldots,N\). Số thứ \(i\) là quả bóng vừa rơi vào hộp \(i\). Chương trình tiếp tục lượt tương tác kế.

Như thường lệ, nếu vượt giới hạn bộ nhớ hoặc chương trình gặp lỗi chạy, bài sẽ nhận phán quyết tương ứng. Nếu chương trình tiếp tục chờ sau khi nhận \(-1\), nó sẽ hết thời gian. Bạn có trách nhiệm cho chương trình thoát kịp để nhận Wrong Answer thay vì Time Limit Exceeded.

Bộ chấm sử dụng cùng một nguồn ngẫu nhiên ở mỗi lần chạy. Vì vậy, nếu không có lỗi khác như quá thời gian hay quá bộ nhớ, nộp đúng cùng một mã nguồn hai lần sẽ cho đúng cùng một kết quả hai lần.

Ràng buộc

  • \(T=1000\).
  • \(N=100\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): tổng số lượt cho phép \(K=16500\).
  • Test Set 2 (phán quyết hiển thị): tổng số lượt cho phép \(K=12500\).
  • Test Set 3 (phán quyết hiển thị): tổng số lượt cho phép \(K=11500\).

Công cụ kiểm thử

Bạn có thể dùng công cụ kiểm thử để chạy cục bộ hoặc trên nền tảng. Khi chạy cục bộ, cần chạy công cụ song song với chương trình; có thể dùng interactive runner. Hãy đọc hướng dẫn trong phần chú thích của tệp đó và phần Interactive Problems trong FAQ.

Hướng dẫn cho công cụ kiểm thử nằm trong các chú thích bên trong công cụ. Bạn được khuyến khích thêm test riêng. Dù công cụ nhằm mô phỏng hệ thống chấm, nó không phải hệ thống chấm thật và có thể hành xử khác. Nếu mã vượt qua công cụ nhưng trượt bộ chấm thật, hãy kiểm tra phần Coding trong FAQ để bảo đảm dùng cùng trình biên dịch với hệ thống chính thức.

Ví dụ

Ví dụ tương tác

Cuộc tương tác bắt đầu khi bộ chấm gửi số test, số hộp mỗi test và tổng số lượt cho phép:

Bộ chấm
2 4 8

Test 1. Bộ chấm gửi danh sách chưa sắp:

Bộ chấm
1 4 3 2

Lời giải gán màu \(1\) cho hộp thứ nhất, màu \(2\) cho hộp thứ hai và thứ tư, màu \(3\) cho hộp thứ ba.

Lời giải
1 2 3 2

Bộ chấm buộc bóng ở các nhóm màu \(1\)\(3\) trở lại hộp cũ, rồi chọn ngẫu nhiên có đổi hai bóng ở hộp thứ hai và thứ tư hay không. Lần này chúng không đổi chỗ, nên bộ chấm trả \(0\) và thứ tự mới vẫn như cũ:

Bộ chấm
0
1 4 3 2

Lời giải lặp lại phép gán trước:

Lời giải
1 2 3 2

Lần này bộ chấm đổi chỗ bóng \(4\)\(2\), nên trả \(1\), báo test đã được giải, rồi lập tức bắt đầu test tiếp theo:

Bộ chấm
1

Test 2. Bộ chấm gửi danh sách chưa sắp:

Bộ chấm
2 1 4 3

Lời giải gán cả bốn hộp màu \(4\). Không dùng màu \(1\), \(2\) hay \(3\) vẫn hoàn toàn hợp lệ.

Lời giải
4 4 4 4

Bộ chấm chọn một thứ tự ngẫu nhiên mới. Thật may, các bóng rơi đúng thứ tự! Bộ chấm trả \(1\), báo test đã được giải, và không gửi gì thêm vì đây là test cuối. Chương trình phải kết thúc không lỗi để tránh Time Limit Exceeded.

Bộ chấm
1

Cuộc tương tác mẫu không thỏa ràng buộc của bất kỳ Test Set nào; nó chỉ nhằm làm rõ định dạng vào/ra.

Nguồn

Google Code Jam 2022, Vòng 3, bài Revenge of GoroSort.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

4. Google Code Jam 2022 - Win As Second

Điểm: 100 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Ueli và Vreni đang chơi một trò chơi. Bàn chơi là một cây\(N\) đỉnh, ban đầu tất cả đều màu xanh dương. Hai người lần lượt đi, Ueli đi trước. Trong mỗi lượt, người chơi phải chọn một đỉnh xanh, cùng với một tập con bất kỳ, có thể rỗng hoặc gồm tất cả, các hàng xóm xanh của đỉnh đó, rồi tô đỏ toàn bộ những đỉnh đã chọn. Nếu khi bắt đầu lượt của một người mà mọi đỉnh đều đã đỏ, người đó thua và người còn lại thắng.

Trong ván ví dụ dưới đây, lượt đầu Ueli tô đỏ đỉnh \(3\). Sau đó Vreni chọn đỉnh \(2\) và tô đỏ cả nó lẫn hàng xóm là đỉnh \(1\). Vì lúc này mọi đỉnh đều đỏ, Ueli thua và Vreni thắng.

Ueli và Vreni nhận thấy Ueli dễ thắng hơn nhiều vì được đi trước. Do đó họ dùng quy trình sau: trước hết Ueli chọn một số nguyên \(N\); tiếp theo Vreni chọn một cây bất kỳ có \(N\) đỉnh; rồi họ bắt đầu chơi như mô tả, Ueli đi lượt đầu.

Vreni hy vọng quyền chọn cây sẽ giúp cô vượt qua bất lợi đi sau. Hãy chứng minh điều đó bằng cách giúp Vreni thắng trong thiết lập này.

Dữ liệu vào

Đây là bài tương tác. Hãy bảo đảm bạn đã đọc phần Interactive Problems trong FAQ của Google Code Jam.

Ban đầu, chương trình đọc một dòng chứa số nguyên \(T\), số bộ test. Sau đó phải xử lý \(T\) bộ test.

Dữ liệu ra

Trong mỗi bộ test, chương trình phải in một cây, rồi gửi các nước đi theo giao thức tương tác bên dưới. Sau mỗi lần in dữ liệu, phải đẩy bộ đệm đầu ra.

Giao thức tương tác

Với mỗi bộ test, trước hết chương trình đọc một dòng chứa \(N\), số đỉnh Ueli chọn. Sau đó chương trình phải in \(N-1\) dòng mô tả các cạnh của cây Vreni chọn. Các đỉnh đánh số từ \(1\) tới \(N\). Mỗi dòng biểu diễn một cạnh riêng biệt bằng hai số nguyên thuộc \([1,N]\), là hai đầu cạnh. Toàn bộ các cạnh phải tạo thành một cây. Hai đầu cạnh có thể in theo bất kỳ thứ tự nào, và \(N-1\) dòng cũng có thể theo bất kỳ thứ tự nào.

Tiếp theo, chương trình đọc một dòng chứa \(M\), số ván phải chơi trên cây này. Các ván độc lập: mọi đỉnh lại xanh ở đầu mỗi ván.

Trong mỗi ván, cần xử lý một số lượt trao đổi cho tới khi ván kết thúc. Mỗi lượt trao đổi gồm một nước của mỗi người.

Đầu mỗi lượt trao đổi, chương trình đọc hai dòng mô tả nước của Ueli. Dòng đầu chứa số nguyên \(K\), số đỉnh xanh sẽ được tô đỏ. Dòng thứ hai chứa \(K\) số nguyên đôi một khác nhau \(A_1,A_2,\ldots,A_K\), là các đỉnh xanh được tô đỏ. Luôn có \(K\ge1\), mỗi \(A_i\) thuộc \([1,N]\), và mọi đỉnh \(A_2,A_3,\ldots,A_K\) đều là hàng xóm của \(A_1\).

Sau đó, chương trình phải in nước của Vreni theo cùng định dạng: dòng đầu là số đỉnh xanh sẽ tô đỏ, dòng thứ hai là các số đỉnh, theo thứ tự sao cho mọi đỉnh trừ đỉnh đầu đều là hàng xóm của đỉnh đầu.

Nếu sau lượt của Vreni mọi đỉnh đều đỏ, Vreni đã thắng và ván kết thúc. Ván kế tiếp bắt đầu ngay nếu còn; nếu đó là ván cuối của test, test kế tiếp bắt đầu ngay nếu còn. Nếu đây là test cuối, bộ chấm không gửi thêm gì và chương trình cũng không được gửi thêm gì.

Ngược lại, nếu sau nước của Ueli mọi đỉnh đều đỏ, Vreni đã thua nên chương trình không vượt qua test. Thay vì bắt đầu lượt trao đổi mới bằng một nước cuối tô đỏ mọi đỉnh còn lại, bộ chấm in một số \(-1\), không gửi thêm gì và không xử lý thêm ván hay test nào.

Nếu tại bất kỳ thời điểm nào bộ chấm nhận một dòng sai định dạng hoặc không hợp lệ — chẳng hạn sai số lượng số nguyên, số ngoài miền, tập cạnh không tạo thành cây, cố tô đỉnh đã đỏ, hoặc cố tô một đỉnh không phải hàng xóm của đỉnh đầu trong lượt — bộ chấm cũng in \(-1\) rồi không gửi thêm gì. Nếu chương trình tiếp tục chờ sau khi nhận \(-1\), nó sẽ hết thời gian. Bạn có trách nhiệm cho chương trình thoát kịp để nhận Wrong Answer thay vì Time Limit Exceeded. Như thường lệ, vượt giới hạn bộ nhớ hoặc lỗi chạy sẽ nhận phán quyết tương ứng.

Bộ chấm có tính xác định: hai lần nộp in cùng các số sẽ nhận cùng dữ liệu vào. Dĩ nhiên, bộ chấm vẫn có thể thực hiện những nước khác nhau ở các ván khác nhau trên cùng một cây.

Ràng buộc

  • \(1\le M\le50\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(T=1\), \(N=30\).
  • Test Set 2 (phán quyết ẩn): \(1\le T\le10\), \(31\le N\le40\), và không hai test nào dùng cùng một \(N\).

Công cụ kiểm thử

Bạn có thể dùng công cụ kiểm thử để chạy cục bộ hoặc trên nền tảng. Khi chạy cục bộ, cần chạy công cụ song song với chương trình; có thể dùng interactive runner. Hãy đọc hướng dẫn trong phần chú thích của tệp đó và phần Interactive Problems trong FAQ.

Hướng dẫn cho công cụ nằm trong các chú thích bên trong nó. Bạn được khuyến khích thêm test riêng. Dù công cụ nhằm mô phỏng hệ thống chấm, nó không phải hệ thống chấm thật và có thể hành xử khác. Nếu mã vượt qua công cụ nhưng trượt bộ chấm thật, hãy kiểm tra phần Coding trong FAQ để bảo đảm dùng cùng trình biên dịch với hệ thống chính thức.

Công cụ kiểm thử chỉ chọn ngẫu nhiên nước của Ueli, trừ khi Ueli có thể thắng trong một lượt. Vì thế, thắng công cụ có thể dễ hơn thắng bộ chấm thật, vốn sẽ cố gắng thắng hơn.

Ví dụ

Ví dụ tương tác

Bộ chấm gửi số test:

Bộ chấm
2

Test 1. Bộ chấm cho \(N=3\):

Bộ chấm
3

Lời giải in một cây ba đỉnh:

Lời giải
1 2
1 3

Bộ chấm báo sẽ chơi một ván trên cây:

Bộ chấm
1

Trong ván đầu, bộ chấm tô đỏ đỉnh \(3\). Lưu ý rằng bộ chấm đã có thể thắng ngay bằng cách tô đỏ mọi đỉnh; vì thế \(-1\) cũng có thể là đầu ra của bộ chấm ở đây.

Bộ chấm
1
3

Lời giải tô đỏ hai đỉnh còn lại và thắng. Vì test đầu chỉ có một ván, ta chuyển sang test kế.

Lời giải
2
1 2

Test 2. Bộ chấm cho \(N=4\):

Bộ chấm
4

Lời giải in cây như hình minh họa bên dưới:

Lời giải
1 2
2 3
2 4

Bộ chấm báo sẽ chơi hai ván:

Bộ chấm
2

Trong ván thứ nhất, bộ chấm tô đỏ ba đỉnh đầu. Đỉnh \(2\) bắt buộc phải được in đầu tiên trong dòng các đỉnh của nước này.

Bộ chấm
3
2 1 3

Lời giải tô đỏ đỉnh còn lại và thắng, rồi chuyển sang ván kế.

Lời giải
1
4

Trong ván thứ hai, bộ chấm đi tốt hơn ở lượt đầu bằng cách tô đỏ hai đỉnh giữa:

Bộ chấm
2
2 3

Lời giải tô đỏ đỉnh \(1\):

Lời giải
1
1

Lúc này bộ chấm có thể thắng bằng cách tô đỏ đỉnh cuối, nên lời giải sai:

Bộ chấm
-1

Cuộc tương tác mẫu không thỏa ràng buộc của Test Set nào vì các giá trị \(N\) quá nhỏ; nó chỉ nhằm làm rõ định dạng vào/ra.

Dưới đây là ván thứ nhất của test số 2 ở trạng thái đầu và sau mỗi lượt:

Dưới đây là ván thứ hai của test số 2 ở trạng thái đầu và sau mỗi lượt:

Nguồn

Google Code Jam 2022, Vòng 3, bài Win As Second.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.