Google Code Jam 2021 - Round 3

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2021 - Binary Search Game 35 4.0s 1G
2 Google Code Jam 2021 - Build-A-Pair 15 5.0s 1G
3 Google Code Jam 2021 - Fence Design 30 20.0s 1G
4 Google Code Jam 2021 - Square Free 20 1.0s 1G

1. Google Code Jam 2021 - Binary Search Game

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

Alice và Bob chơi trò Binary Search trên một bảng một hàng gồm \(2^L\) ô. Mỗi ô chứa một số nguyên từ \(1\) đến \(N\). Ngoài ra có \(N\) lá bài đánh số \(1\) đến \(N\). Trước mỗi ván, trọng tài ghi lên mỗi lá một số từ \(1\) đến \(M\), theo một trong \(M^N\) cách. Alice và Bob biết mọi số trên bảng và trên bài trước khi chơi.

Hai người luân phiên, Alice đi trước. Có tổng cộng \(L\) lượt: Alice đi \(\lceil L/2\rceil\) lượt, Bob đi \(\lfloor L/2\rfloor\) lượt. Mỗi lượt, người chơi loại nửa trái hoặc nửa phải của các ô còn lại.

Ví dụ, với bảng \([2,4,1,1,4,5,2,5]\), Alice đầu tiên phải để lại \([2,4,1,1]\) hoặc \([4,5,2,5]\). Nếu cô loại nửa trái và để \([4,5,2,5]\), Bob chọn giữa \([4,5]\)\([2,5]\). Nếu Bob để \([2,5]\), lượt cuối Alice chọn giữa \([2]\)\([5]\).

Khi kết thúc, gọi \(X\) là số trong ô duy nhất còn lại. Điểm là số trọng tài ghi trên lá bài số \(X\). Trong ví dụ, nếu Alice loại \([5]\) và để \([2]\), điểm là số trên lá bài \(2\).

Alice chơi tối ưu để tối đa hóa điểm, Bob chơi tối ưu để tối thiểu hóa. Bảng cố định chứa \(A_1,\ldots,A_{2^L}\). Để công bằng tối đa, họ chơi đủ \(M^N\) ván, mỗi ván dùng một cách ghi số khác nhau lên các lá; mỗi cách xuất hiện đúng một lần. Hãy tính tổng điểm của mọi ván, lấy modulo số nguyên tố \(10^9+7\).

Dữ liệu vào

Dòng đầu chứa \(T\). Mỗi bộ đúng hai dòng: dòng đầu chứa \(N,M,L\); dòng sau chứa \(2^L\) số \(A_1,\ldots,A_{2^L}\) từ trái sang phải.

Dữ liệu ra

Với mỗi bộ, in Case #x: y, trong đó \(y\) là tổng điểm của \(M^N\) ván modulo \(1000000007\).

Ràng buộc

  • \(1\le T\le12\); \(1\le L\le5\); \(1\le A_i\le N\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(1\le N\le8\), \(1\le M\le100\).
  • Test Set 2 (Hidden Verdict): \(1\le N\le32\), \(1\le M\le10^9\).

Đ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 9/35 25,71%
Test Set 2 26/35 74,29%

Ví dụ

Ví dụ 1

Input
3
2 2 2
2 1 1 1
4 3 2
3 1 1 4
5 100 3
2 4 1 1 4 5 2 5
Output
Case #1: 6
Case #2: 144
Case #3: 991661422
Giải thích

Mẫu #1 có bốn cách ghi bài: \([1,1],[1,2],[2,1],[2,2]\). Với hai cách đầu, dù Alice chọn gì ở lượt đầu, Bob luôn có thể làm ô cuối là \(1\); lá \(1\) ghi \(1\), nên mỗi ván được \(1\). Với hai cách cuối, Alice loại nửa trái, để \([1,1]\) cho Bob; Bob buộc để \([1]\). Lá \(1\) ghi \(2\), nên mỗi ván được \(2\). Tổng là \(1+1+2+2=6\).

Nguồn

Google Code Jam 2021, Vòng 3, bài Binary Search Game.

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 2021 - Build-A-Pair

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

Bạn muốn dựng một cặp số nguyên dương. Bạn được cho một danh sách chữ số thập phân và phải dùng mỗi chữ số đúng một lần, nhưng được chọn chữ số nào thuộc số thứ nhất, chữ số nào thuộc số thứ hai.

Bạn cũng được chọn thứ tự chữ số trong mỗi số, ngoại trừ việc chữ số có nghĩa lớn nhất (bên trái nhất) của mỗi số không được là \(0\). Đặc biệt, không thể chọn riêng một chữ số \(0\) làm một số, vì số đó không dương.

Ví dụ, với danh sách \([1,0,2,0,4,3]\), hai cặp hợp lệ là \((200,143)\)\((3,12400)\). Các cặp sau không hợp lệ:

  • \((0102,34)\): có số \(0\) ở đầu;
  • \((0,12340)\): có một số không dương;
  • \((10,243)\)\((12300,47)\): danh sách chữ số trong mỗi cặp không đúng bằng danh sách đã cho.

Với danh sách chữ số, hãy tìm hiệu tuyệt đối nhỏ nhất có thể giữa hai số được dựng.

Dữ liệu vào

Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi dòng tiếp theo chứa một xâu chữ số \(D\); mỗi ký tự của \(D\) là một chữ số bắt buộc phải dùng.

Dữ liệu ra

Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(x\) là số thứ tự (bắt đầu từ \(1\)), còn \(y\) là hiệu tuyệt đối nhỏ nhất giữa hai số được dựng từ \(D\) theo các quy tắc trên.

Ràng buộc

  • \(1\le T\le100\).
  • Mỗi ký tự của \(D\) là một chữ số thập phân.
  • Ít nhất hai ký tự của \(D\) khác 0.

Phân nhóm

  • Test Set 1 (Visible Verdict): \(2\le |D|\le8\).
  • Test Set 2 (Visible Verdict): \(2\le |D|\le36\).

Đ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 3/15 20%
Test Set 2 12/15 80%

Ví dụ

Ví dụ 1

Input
4
1234
0011
07080
0899
Output
Case #1: 7
Case #2: 0
Case #3: 620
Case #4: 1
Giải thích

Các cặp tối ưu lần lượt là \((31,24)\), \((10,10)\), \((700,80)\)\((89,90)\).

Nguồn

Google Code Jam 2021, Vòng 3, bài Build-A-Pair.

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 2021 - Fence Design

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

Bạn được Công ty Xây dựng Hàng rào thuê làm nhân viên tạm thời và được giao hoàn thiện thiết kế hàng rào cho một cánh đồng. Mỗi hàng rào phải là một đoạn thẳng nối hai cọc. Mỗi cọc chiếm một điểm duy nhất và có vị trí cố định. Không có ba cọc nào thẳng hàng. Các hàng rào không được giao nhau, trừ trường hợp chúng gặp nhau tại đầu mút (các cọc).

Một người khác đã bắt đầu bản thiết kế nhưng bỏ dự án sau khi thêm đúng hai hàng rào. Bạn cần hoàn thiện thiết kế của họ. Để gây ấn tượng với cấp trên và khách hàng, bạn muốn thiết kế có nhiều hàng rào nhất có thể, bất kể độ dài của chúng.

Cho vị trí các cọc và những hàng rào đã dựng, hãy tìm cách thêm nhiều hàng rào nhất sao cho không có hai hàng rào nào (mới hoặc có sẵn) giao nhau, ngoại trừ có thể tại đầu mút (các cọc).

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test bắt đầu bằng một dòng chứa số nguyên \(N\), số lượng cọc. Sau đó là \(N\) dòng; dòng thứ \(i\) chứa hai số nguyên \(X_i,Y_i\), là tọa độ X và Y của cọc thứ \(i\). Hai dòng cuối của mỗi bộ test mô tả hai hàng rào có sẵn. Mỗi dòng chứa hai số nguyên \(P_k,Q_k\), nghĩa là hàng rào có sẵn thứ \(k\) nối cọc thứ \(P_k\) và cọc thứ \(Q_k\) (các cọc được đánh số từ \(1\)).

Dữ liệu ra

Với mỗi bộ test, in một dòng theo dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là số hàng rào lớn nhất có thể thêm vào thiết kế (không tính hai hàng rào có sẵn). Sau đó in thêm \(y\) dòng. Mỗi dòng chứa hai số nguyên phân biệt \(i,j\) (đều từ \(1\) đến \(N\)), biểu diễn một hàng rào riêng nối cọc thứ \(i\) và cọc thứ \(j\). Không có cặp nào trong \(y+2\) hàng rào (gồm cả hàng rào có sẵn và hàng rào bạn thêm) được chồng lấn, ngoại trừ có thể tại đầu mút.

Ràng buộc

  • \(1\le T\le50\).
  • \(-10^9\le X_i\le10^9\)\(-10^9\le Y_i\le10^9\) với mọi \(i\).
  • \((X_i,Y_i)\ne(X_j,Y_j)\) với mọi \(i\ne j\).
  • \(1\le P_k<Q_k\le N\) với mọi \(k\).
  • Hai hàng rào có sẵn không giao nhau, ngoại trừ có thể tại đầu mút.
  • Không có ba cọc nào thẳng hàng.

Phân nhóm

Phân nhóm 1 (phản hồi hiện)
  • \(4\le N\le100\).
Phân nhóm 2 (phản hồi ẩn)
  • \(4\le N\le10^5\).

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

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Phân nhóm 1 11/30 36,67%
Phân nhóm 2 19/30 63,33%

Ví dụ

Ví dụ 1

Input
2
4
0 0
0 1
1 1
1 0
1 2
3 4
5
0 0
0 1
1 1
1 0
2 3
1 2
3 5
Output
Case #1: 3
1 4
2 3
4 2
Case #2: 6
5 4
2 4
5 2
1 4
4 3
3 2
Giải thích

Các hình dưới đây biểu diễn các cọc và hàng rào trong những ví dụ đã cho. Những hàng rào có nét màu xanh rộng hơn là hai hàng rào có sẵn; các hàng rào còn lại minh họa một cách thêm số hàng rào lớn nhất như trong output mẫu.

Nguồn

Google Code Jam 2021, Vòng 3, bài Fence Design.

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 2021 - Square Free

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

Ta có một ma trận gồm các ô vuông với \(R\) hàng và \(C\) cột. Cần vẽ một đường chéo trong mỗi ô. Mỗi ô phải chứa đúng một trong hai đường chéo có thể có: đường chéo xuôi /, nối góc dưới trái với góc trên phải của ô, hoặc đường chéo ngược \, nối góc trên trái với góc dưới phải.

Với mỗi hàng và mỗi cột, ta muốn vẽ một số lượng cụ thể đường chéo của từng loại. Ngoài ra, sau khi vẽ xong, ma trận phải không có hình vuông (square free), nghĩa là không được tồn tại hình vuông nào tạo bởi các đường chéo đã thêm.

Ví dụ, giả sử ma trận có \(4\) hàng và \(4\) cột. Số bên cạnh mỗi hàng là số đường chéo / chính xác phải có trong hàng đó. Số bên dưới mỗi cột là số đường chéo / chính xác phải có trong cột đó.

Có nhiều cách điền ma trận mà vẫn tôn trọng những số lượng theo hàng và cột ấy. Dưới đây là ba khả năng:

Hai ma trận đầu không square free, còn ma trận thứ ba thì có. Trong ma trận đầu tiên, có một hình vuông với cạnh dài bằng \(2\) đường chéo, các đỉnh nằm ở trung điểm bốn cạnh của ma trận. Trong ma trận thứ hai, có một hình vuông cạnh dài bằng \(1\) đường chéo ở góc dưới bên phải. Trong ma trận thứ ba không có hình vuông nào. Vì thế, ma trận thứ ba là một cách vẽ hợp lệ theo mọi quy tắc.

Cho kích thước ma trận và số đường chéo / chính xác phải vẽ trong mỗi hàng và mỗi cột, hãy tạo ra một ma trận square free thỏa các ràng buộc hàng và cột, hoặc thông báo rằng không tồn tại ma trận như vậy.

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test gồm đúng ba dòng. Dòng đầu chứa \(R,C\), là số hàng và số cột của ma trận. Dòng thứ hai chứa \(R\) số nguyên \(S_1,S_2,\ldots,S_R\); \(S_i\) là số đường chéo / chính xác phải vẽ trong hàng thứ \(i\) tính từ trên xuống. Dòng thứ ba chứa \(C\) số nguyên \(D_1,D_2,\ldots,D_C\); \(D_i\) là số đường chéo / chính xác phải vẽ trong cột thứ \(i\) tính từ trái sang.

Dữ liệu ra

Với mỗi bộ test, in một dòng theo dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\)IMPOSSIBLE nếu không có ma trận đã điền nào tuân theo mọi quy tắc, và là POSSIBLE trong trường hợp ngược lại. Nếu in POSSIBLE, hãy in thêm \(R\) dòng, mỗi dòng gồm \(C\) ký tự. Ký tự thứ \(j\) trên dòng thứ \(i\) phải là / nếu ô ở hàng thứ \(i\) từ trên xuống, cột thứ \(j\) từ trái sang trong ma trận đề xuất chứa đường chéo xuôi; nếu không thì phải là \. Ma trận đề xuất phải hợp lệ theo mọi quy tắc.

Ràng buộc

  • \(1\le T\le100\).
  • \(0\le S_i\le C\) với mọi \(i\).
  • \(0\le D_i\le R\) với mọi \(i\).

Phân nhóm

Phân nhóm 1 (phản hồi hiện)
  • \(2\le R\le6\).
  • \(2\le C\le6\).
Phân nhóm 2 (phản hồi ẩn)
  • \(2\le R\le20\).
  • \(2\le C\le20\).

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

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Phân nhóm 1 7/20 35%
Phân nhóm 2 13/20 65%

Ví dụ

Ví dụ 1

Input
4
4 4
3 2 3 3
3 3 2 3
2 3
1 1
1 1 1
2 3
1 2
1 1 1
3 3
2 0 2
2 0 2
Output
Case #1: POSSIBLE
//\/
\/\/
///\
/\//
Case #2: IMPOSSIBLE
Case #3: POSSIBLE
\\/
//\
Case #4: POSSIBLE
/\/
\\\
/\/
Giải thích

Test mẫu #1 chính là ví dụ đã giải thích ở trên.

Trong Test mẫu #2, theo tổng các hàng phải có tổng cộng \(2\) đường chéo /, nhưng theo tổng các cột lại phải có \(3\). Vì thế không thể tuân theo mọi quy tắc.

Trong Test mẫu #3, những ma trận duy nhất tuân theo tổng hàng và cột là ba ma trận sau:

Vì hai ma trận đầu chứa một hình vuông, ma trận thứ ba là output hợp lệ duy nhất cho trường hợp này.

Trong Test mẫu #4, chỉ có một cách điền ma trận thỏa các tổng hàng và cột, như hình dưới. Nó tạo ra đúng một hình chữ nhật, được tô màu xanh trong hình. Tuy nhiên, vì hình chữ nhật ấy không phải hình vuông nên ma trận vẫn square free.

Nguồn

Google Code Jam 2021, Vòng 3, bài Square Free.

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