Google Code Jam 2013 - World Finals

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2013 - Can't Stop 43 4.0s 1G
2 Google Code Jam 2013 - Drummer 29 20.0s 1G
3 Google Code Jam 2013 - Graduation Requirements 25 1.0s 1G
4 Google Code Jam 2013 - Let Me Tell You a Story 64 18.5s 1G
5 Google Code Jam 2013 - X Marks the Spot 39 2.5s 1G

1. Google Code Jam 2013 - Can't Stop

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

Bài toán này được lấy cảm hứng từ một trò chơi bàn cờ có tên là Can't Stop, được thiết kế bởi Sid Sackson. Bài toán này có ý tưởng tương tự, nhưng không yêu cầu bạn phải từng chơi Can't Stop.

Bạn đang chơi một trò chơi bàn cờ (rất lớn). Trong trò chơi này, bạn được cung cấp một chuỗi gồm \(N\) bộ tung xúc xắc (roll sets). Mỗi bộ tung xúc xắc gồm \(D\) lần tung. Mỗi lần tung xúc xắc là một số nguyên.

Để thắng trò chơi, bạn phải tìm khoảng cực kỳ tuyệt vời (totally awesome interval) lớn nhất của chuỗi. Một khoảng là bất kỳ một đoạn liên tiếp các bộ tung xúc xắc nào. Một khoảng được gọi là cực kỳ tuyệt vời nếu tồn tại \(k\) số sao cho mọi bộ tung xúc xắc trong khoảng đó chứa ít nhất một trong \(k\) số đó.

Ví dụ, giả sử \(D=2\)\(k=3\), và các bộ tung xúc xắc như sau:

Set 0: 10 20
Set 1: 50 60
Set 2: 70 30
Set 3: 40 40
Set 4: 30 30
Set 5: 20 40

Khoảng từ Bộ 0 đến Bộ 2 là cực kỳ tuyệt vời vì các bộ tung xúc xắc từ 0-2 đều chứa 10, 50 hoặc 70. Khoảng từ Bộ 1 đến Bộ 5 là cực kỳ tuyệt vời vì các bộ tung xúc xắc từ 1-5 đều chứa 50, 30 hoặc 40. Khoảng đó chứa 5 bộ tung xúc xắc, và đó là khoảng cực kỳ tuyệt vời lớn nhất.

Nhiệm vụ của bạn là xuất ra chỉ số của bộ tung xúc xắc đầu tiên và cuối cùng trong khoảng cực kỳ tuyệt vời dài nhất. Nếu có nhiều khoảng cực kỳ tuyệt vời cùng độ dài đó, hãy xuất ra các chỉ số của khoảng có chỉ số đầu tiên nhỏ nhất. Lưu ý rằng bộ tung xúc xắc đầu tiên có chỉ số là 0.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test theo sau. Mỗi bộ test bắt đầu bằng ba số nguyên cách nhau bởi dấu cách: \(N\), \(D\)\(k\), như mô tả ở trên. Trên dòng tiếp theo, sẽ có \(N \times D\) số nguyên. \(D\) số nguyên đầu tiên sẽ là các lần tung từ bộ tung xúc xắc đầu tiên; \(D\) số nguyên tiếp theo sẽ là các lần tung từ bộ tung xúc xắc thứ hai; và cứ tiếp tục như vậy.

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất ra một dòng chứa "Case #x: y z", trong đó x là số thứ tự bộ test (bắt đầu từ 1), và y và z là chỉ số đầu tiên và cuối cùng của khoảng cực kỳ tuyệt vời dài nhất (ưu tiên chỉ số đầu tiên nhỏ nhất nếu có tranh chấp), như mô tả ở trên.

Ràng buộc

  • \(1 \le T \le 100\).
  • \(1 \le D \le 4\).
  • \(1 \le \text{mỗi lần tung xúc xắc} \le 10^5\).
  • Đối với 6 bộ test, \(1 \le N \le 10^5\).
  • Đối với tất cả các bộ test còn lại, \(1 \le N \le 10^3\).

Phân nhóm

  • Small dataset (Test set 1 - Visible): \(k = 2\).
  • Large dataset (Test set 2 - Hidden): \(2 \le k \le 3\).

Đ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 11/43 25,58%
Test Set 2 32/43 74,42%

Ví dụ

Ví dụ 1

Input
4
8 1 2
1 2 3 2 4 5 4 6
4 3 2
1 2 3 4 5 6 7 8 9 10 11 12
6 2 3
10 20 50 60 70 30 40 40 30 30 20 40
10 1 3
2 4 3 1 4 5 3 1 1 2
Output
Case #1: 1 3
Case #2: 0 1
Case #3: 1 5
Case #4: 1 4

Trò chơi bàn cờ Can't Stop được thiết kế bởi Sid Sackson, và đã được xuất bản bởi nhiều nhà xuất bản. Cả ông Sackson và bất kỳ nhà xuất bản nào đều không xác nhận, hoặc có bất kỳ sự liên quan nào đến Google Code Jam.

Nguồn

Google Code Jam 2013, Chung kết thế giới, bài Can't Stop.

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 2013 - Drummer

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

Người đánh trống đóng vai trò rất quan trọng trong bất kỳ ban nhạc nào — giữ nhịp. Nếu nhịp điệu của người đánh trống không đều, nó có thể làm hỏng cả buổi biểu diễn.

Bạn là ca sĩ chính của một ban nhạc rock rất nổi tiếng, và bạn đang gặp một chút vấn đề. Người đánh trống của bạn vừa rời ban nhạc để trở thành một game thủ chuyên nghiệp. Bạn cần tìm một người đánh trống mới ngay lập tức. May mắn thay, không thiếu các ứng viên. Mọi người đều muốn có cơ hội tham gia ban nhạc của bạn. Nhiệm vụ của bạn là tìm ra người đánh trống giỏi nhất trong số các ứng viên, và bạn muốn người có thể giữ nhịp ổn định nhất.

Kế hoạch của bạn như sau. Bạn sẽ yêu cầu mỗi ứng viên thử giọng riêng lẻ. Trong buổi thử giọng, ứng viên sẽ chơi một chiếc trống bằng cách gõ vào nó bằng dùi trống vài lần. Lý tưởng nhất là khoảng thời gian giữa các lần gõ liên tiếp phải hoàn toàn giống nhau, tạo ra một nhịp điệu hoàn hảo. Trong một nhịp điệu hoàn hảo, các mốc thời gian của các lần gõ trống sẽ tuân theo một cấp số cộng như sau: \(T_0, T_0 + K, T_0 + 2 \times K, \dots, T_0 + (N - 1) \times K\).

Tất nhiên, trong thực tế, con người gần như không thể tạo ra một nhịp điệu hoàn hảo. Do đó, mỗi ứng viên đánh trống sẽ tạo ra một nhịp điệu có sai số \(E\), sao cho mỗi \(T_i\) khác biệt tối đa \(E\) so với một nhịp điệu hoàn hảo nào đó. Cho một chuỗi các lần gõ trống của một ứng viên, hãy tìm giá trị \(E\) nhỏ nhất có thể trong số tất cả các nhịp điệu hoàn hảo mà ứng viên đó có thể đã cố gắng chơi.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ thử nghiệm, \(T\). \(T\) bộ thử nghiệm tiếp theo. Mỗi bộ gồm hai dòng và đại diện cho buổi thử giọng của một ứng viên. Dòng đầu tiên chứa một số nguyên duy nhất — \(N\). Dòng tiếp theo chứa \(N\) số nguyên cách nhau bởi dấu cách — các mốc thời gian, tính bằng mili giây, của các lần gõ trống do ứng viên thực hiện. Các mốc thời gian được cho theo thứ tự tăng dần.

Dữ liệu ra

Đối với mỗi bộ thử nghiệm, hãy xuất một dòng chứa "Case #x: \(E\)", trong đó x là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và \(E\) là số nhỏ nhất trong số tất cả các số có thể mô tả sai số của chuỗi gõ trống của ứng viên.

Câu trả lời của bạn sẽ được coi là chính xác nếu nó nằm trong khoảng sai số tuyệt đối hoặc tương đối là \(10^{-6}\) so với câu trả lời đúng.

Ràng buộc

  • \(1 \le T \le 100\).

Phân nhóm

  • Nhóm 1 (Visible):

  • \(2 \le N \le 10\).

  • \(0 \le T_i \le 100\).
  • Nhóm 2 (Hidden):

  • Đối với 90% các bộ thử nghiệm, \(2 \le N \le 1000\).

  • Đối với tất cả các bộ thử nghiệm, \(2 \le N \le 50000\).
  • \(0 \le T_i \le 10^6\).

Đ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/29 31,03%
Test Set 2 20/29 68,97%

Ví dụ

Ví dụ 1

Input
3
2
10 70
4
0 10 19 30
6
2 5 10 15 20 24
Output
Case #1: 0
Case #2: 0.5
Case #3: 0.75

Nguồn

Google Code Jam 2013, Chung kết thế giới, bài Drummer.

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 2013 - Graduation Requirements

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

Trước khi tốt nghiệp Đại học Lập trình viên Tuyệt vời, sinh viên theo truyền thống phải thực hiện một số "yêu cầu tốt nghiệp". Một trong số đó là lái xe ngược chiều quanh một vòng xuyến giao thông. Với hầu hết mọi người, điều này đã đủ điên rồ rồi, nhưng như một thử thách thêm, bạn muốn xem liệu mình có thể đi ngược chiều quanh vòng xuyến nhiều vòng mà không dừng lại hay không.

Vòng xuyến giao thông bao gồm \(N\) giao lộ, cách đều nhau quanh vòng tròn. Một chiếc xe bình thường sẽ đi vào vòng xuyến tại một giao lộ, và sau mỗi giây, nó sẽ di chuyển đến giao lộ tiếp theo theo chiều ngược chiều kim đồng hồ, cho đến khi cuối cùng nó đến đích và rời đi.

Bạn đã quan sát các xe đi vào và rời khỏi vòng xuyến trong \(X\) giây. Với mỗi xe, bạn ghi lại thời điểm nó vào vòng xuyến, cũng như các giao lộ nó vào và ra. Tất cả các xe đều di chuyển ngược chiều kim đồng hồ với tốc độ 1 giao lộ mỗi giây. Mỗi chiếc xe bạn quan sát đều rời khỏi vòng xuyến trước khi quay trở lại giao lộ mà nó đã đi vào. Có nhiều làn đường trên vòng xuyến, vì vậy nhiều xe có thể chiếm cùng một vị trí tại cùng một thời điểm.

Nếu bạn đã lập kế hoạch vừa đúng, bạn có thể lái xe theo chiều kim đồng hồ trong vòng xuyến trong bao lâu? Bạn phải vào vòng xuyến tại một thời điểm nguyên \(>= 0\), rời đi tại thời điểm \(<= X\), và một khi bạn đã rời đi, bạn không được phép quay lại. Khi ở trong vòng xuyến, bạn phải di chuyển theo chiều kim đồng hồ với tốc độ 1 giao lộ mỗi giây. Bạn muốn chơi an toàn (theo cách an toàn nhất mà việc lái xe ngược chiều trên vòng xuyến có thể có), vì vậy bạn không bao giờ được chạm hoặc đi ngang qua một chiếc xe khác. Cụ thể, bạn không thể rời vòng xuyến tại một giao lộ mà một chiếc xe khác đang đi vào tại cùng thời điểm đó, và bạn không thể vào vòng xuyến tại một giao lộ mà một chiếc xe khác đang rời đi tại cùng thời điểm đó. Bạn có thể chọn thời điểm và địa điểm để vào và rời khỏi vòng xuyến.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo.
Dòng đầu tiên của mỗi bộ test mô tả số lượng xe \(C\) mà bạn đã quan sát. Dòng thứ hai chứa hai số nguyên, \(X\)\(N\) — thời gian (tính bằng giây) mà bạn quan sát vòng xuyến, và số lượng giao lộ trên vòng xuyến. \(C\) dòng tiếp theo mô tả các xe bạn đã thấy. Mỗi dòng chứa ba số nguyên \(s_i\), \(e_i\)\(t_i\) — giao lộ mà xe đi vào vòng xuyến, giao lộ mà nó rời đi và thời điểm nó đi vào. Các giao lộ được đánh số từ 1 đến \(N\), theo chiều ngược chiều kim đồng hồ (nghĩa là giao lộ số 2 là giao lộ tiếp theo theo chiều ngược chiều kim đồng hồ từ số 1).

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và y là số giây tối đa bạn có thể di chuyển trên vòng xuyến. Lưu ý rằng y có thể bằng 0 cả trong trường hợp bạn không thể vào vòng xuyến và trong trường hợp bạn có thể vào, nhưng không thể di chuyển dù chỉ một giao lộ.

Hãy nhớ rằng bạn được yêu cầu vào vòng xuyến tại một thời điểm được biểu thị bằng một số nguyên giây — bạn phải vào tại một thời điểm nguyên, và do đó đến mỗi giao lộ tại một thời điểm nguyên.

Ràng buộc

  • \(1 \le T \le 100\)
  • \(1 \le s_i, e_i \le N\)
  • \(s_i \neq e_i\)
  • \(0 \le t_i\)
  • Mỗi chiếc xe được quan sát đều rời khỏi vòng xuyến tại thời điểm \(X\) hoặc sớm hơn.

Phân nhóm

  • Small dataset (Test set 1 - Visible): \(3 \le N \le 10, 1 \le X \le 10, 0 \le C \le 10\).
  • Large dataset (Test set 2 - Hidden): \(3 \le N \le 10^{10}, 1 \le X \le 10^{10}, 0 \le C \le 1000\).

Ghi chú chung

Lưu ý: Lái xe ngược chiều giao thông trên vòng xuyến thường không phải là một việc làm khôn ngoan và có thể gây hại cho bạn hoặc người khác. Google (và đặc biệt là Google Code Jam) khuyến khích bạn không nên thử điều này.

Đ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 7/25 28%
Test Set 2 18/25 72%

Ví dụ

Ví dụ 1

Input
5
1
3 4
1 4 0
6
3 5
5 2 0
5 1 2
1 3 0
1 2 2
2 3 0
3 4 0
3
2 3
1 3 0
2 1 0
3 2 0
0
6 4
1
2 3
1 3 0
Output
Case #1: 1
Case #2: 2
Case #3: 0
Case #4: 6
Case #5: 0
Note

Trong trường hợp mẫu đầu tiên, chúng ta có một chiếc xe, đi như trong hình ở đề bài. Có một số cách cho phép chúng ta đi ngược chiều trong một giây — ví dụ, chúng ta có thể vào tại giao lộ 1 lúc 1 giây (chúng ta không thể vào lúc 0 giây, vì xe kia đang ở đó), và đi đến giao lộ 4 (chúng ta không thể đi tiếp đến giao lộ 3, vì chúng ta sẽ đi ngang qua xe kia đang đi từ 3 đến 4). Một lựa chọn khác là vào tại giao lộ 4 lúc 0 giây, và đi đến giao lộ 3 (rồi rời đi).

Trong trường hợp mẫu thứ hai, chúng ta có thể di chuyển trong hai giây bằng cách vào giao lộ 5 lúc 1 giây, và đi ngược chiều đến giao lộ 3. Trong trường hợp mẫu thứ ba, chúng ta thậm chí không thể vào vòng xuyến - có xe ở tất cả các giao lộ tại mỗi giây nguyên. Trong trường hợp thứ tư không có xe nào, vì vậy chúng ta có thể vào vòng xuyến tại bất kỳ điểm nào lúc 0 giây và đi vòng quanh cho đến thời điểm 6. Trong trường hợp thứ năm, chúng ta có thể vào vòng xuyến, nhưng vì chỉ có ba giao lộ, chúng ta sẽ luôn va chạm với xe kia nếu cố gắng di chuyển đến giao lộ tiếp theo.

Nguồn

Google Code Jam 2013, Chung kết thế giới, bài Graduation Requirements.

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 2013 - Let Me Tell You a Story

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

Câu chuyện kể rằng...

Ngày xửa ngày xưa, Vua Tyrone Công Bằng có 4 vị bộ trưởng. Vị bộ trưởng thứ nhất (cố vấn hàng đầu của nhà vua) được trả 7 đồng vàng mỗi tuần. Vị bộ trưởng thứ hai được trả 4 đồng vàng mỗi tuần. Vị bộ trưởng thứ ba và thứ tư mỗi người được trả 6 đồng vàng mỗi tuần. Không may, một ngày nọ Tyrone vô tình để quên Danh sách Thù lao Bộ trưởng trong máy photocopy, và Danh sách này đã xuất hiện trên trang nhất của tờ báo Thời báo Vương quốc. Lúc này, vị bộ trưởng thứ hai yêu cầu được nói chuyện với nhà vua, ông ta rất buồn vì lương của mình thấp hơn lương của vị bộ trưởng thứ ba có cấp bậc thấp hơn.

Đức vua Tyrone Công Bằng thấy không còn giải pháp nào khác ngoài việc sa thải vị bộ trưởng thứ ba. Suy cho cùng, việc giảm lương của bộ trưởng thứ ba, tăng lương của bộ trưởng thứ hai, hay thay đổi chức danh công việc đều là những giải pháp không công bằng theo ý kiến của nhà vua. Và chúng ta là ai mà dám nghi ngờ Vua Tyrone? Tất nhiên, việc sa thải vị bộ trưởng thứ ba không giải quyết được vấn đề. Vị bộ trưởng thứ hai tiếp tục phàn nàn vì lương của ông ta vẫn thấp hơn lương của vị bộ trưởng thứ tư. Thế là Vua Tyrone cũng sa thải luôn vị bộ trưởng thứ tư. Tại thời điểm này, không ai trong số hai vị bộ trưởng còn lại phàn nàn, và mọi người sống hạnh phúc mãi mãi về sau.

...đợi một chút. Tôi đã kể sai rồi. Tôi xin lỗi. Trí nhớ của tôi không còn được như xưa nữa. Chờ tôi một lát... Đúng rồi. Vua Tyrone Công Bằng. Bốn bộ trưởng. Trả lương lần lượt là 7, 4, 6, và 6. À, đúng rồi. Đoạn kết là như thế này...

Khi vị bộ trưởng thứ hai phàn nàn về sự bất công, Vua Tyrone đã sa thải vị bộ trưởng thứ nhất. Một số người có thể nói điều này hơi khắc nghiệt, vì vị bộ trưởng thứ nhất không liên quan gì cả, nhưng chúng ta không nên nghi ngờ Vua Tyrone. Rõ ràng, vị bộ trưởng thứ hai vẫn phàn nàn, nên Vua Tyrone chỉ đơn giản là sa thải ông ta luôn. Trong số hai vị bộ trưởng còn lại, mỗi người đều được trả lương ít nhất bằng bất kỳ vị bộ trưởng nào dưới quyền mình, nên không ai trong số họ phàn nàn. Và mọi người sống hạnh phúc mãi mãi về sau.

Tốt hơn nhiều rồi... tôi nghĩ vậy. Có lẽ thế? Bây giờ tôi cũng không chắc nữa. Tôi biết chắc chắn rằng có \(N\) vị bộ trưởng, và tôi nhớ rõ mức lương của họ. Tôi cũng biết rằng mỗi khi lương của một bộ trưởng thấp hơn lương của một bộ trưởng đứng sau ông ta, ai đó sẽ phàn nàn, và một bộ trưởng nào đó sẽ bị sa thải; nhưng đó có thể là bất kỳ bộ trưởng nào, bất kể bộ trưởng đó có liên quan gì đến vấn đề hay không. Các bộ trưởng tiếp tục bị sa thải cho đến khi không còn ai phàn nàn vì tất cả các mức lương (của những người còn lại) tạo thành một dãy không tăng. Tại thời điểm đó, việc sa thải dừng lại. Nhưng tôi không nhớ các bộ trưởng đã bị sa thải theo thứ tự nào.

Bạn có thể giúp tôi sửa lại câu chuyện của mình không? Hoặc ít nhất hãy cho tôi biết có bao nhiêu câu chuyện khác nhau mà tôi có thể đã kể. Hai câu chuyện được coi là khác nhau nếu trình tự các bộ trưởng bị sa thải trong đó không giống nhau.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo, mỗi bộ gồm hai dòng. Dòng đầu tiên chứa một số nguyên \(N\), và dòng thứ hai chứa \(N\) số nguyên cách nhau bởi dấu cách biểu thị mức lương của các bộ trưởng, theo thứ tự từ vị bộ trưởng thứ nhất đến vị bộ trưởng thứ \(N\).

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và y là số lượng câu chuyện tôi có thể kể cho bạn, modulo 10007.

Ràng buộc

  • Mỗi mức lương sẽ là số nguyên dương và tối đa là 10000.

Phân nhóm

  • Test set 1 (Visible):

    • \(1 \le T \le 100\).
    • \(1 \le N \le 100\).
    • Test set 2 (Hidden):

    • \(1 \le T \le 20\).

    • Đối với 80% số bộ test, \(1 \le N \le 2000\).
    • Đối với tất cả các bộ test, \(1 \le N \le 8000\).

Đ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 14/64 21,88%
Test Set 2 50/64 78,12%

Ví dụ

Ví dụ 1

Input
3
4
7 4 6 6
8
90 80 70 60 50 50 40 30
2
7 8
Output
Case #1: 14
Case #2: 1
Case #3: 2

Nguồn

Google Code Jam 2013, Chung kết thế giới, bài Let Me Tell You a Story.

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

5. Google Code Jam 2013 - X Marks the Spot

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

Đức vua Tyrone Công minh và bốn người con trai của ông đã chinh phục quốc gia Carrania. Bốn người con trai ngay lập tức bắt đầu tranh cãi về việc chia đất đai giữa bốn người họ. Điểm gây tranh cãi chính là các mỏ vàng của Carrania - mỗi người con đều muốn có số lượng mỏ vàng không ít hơn bất kỳ người nào khác.

Đức vua Tyrone sớm cảm thấy mệt mỏi với những cuộc tranh cãi, đặc biệt là khi ông biết số lượng mỏ vàng là \(4N\), vì vậy việc chia chúng sẽ rất dễ dàng. Ông tập hợp các con lại, lấy một bản đồ, vẽ một chữ X lên đó và tuyên bố mỗi người con sẽ nhận được một phần tư quốc gia, với các biên giới được xác định bởi chữ X mà ông đã vẽ.

Không may thay, Đức vua Tyrone hơi bị cận thị, và bản đồ ông vẽ lên không phải là bản đồ của Carrania. Vị tể tướng của ông đã nhanh chóng giấu bản đồ đó đi, và giờ đây đang cố gắng vẽ một chữ X tương tự lên bản đồ Carrania sao cho mỗi người con nhận được số lượng mỏ vàng như nhau. Thật không may, tất cả các con trai đều đã thấy vua Tyrone vẽ chữ X, và biết rằng các biên giới phải là hai đường thẳng vuông góc - vì vậy vị tể tướng phải làm đúng như thế.

Hãy giúp ông ấy! Nhiệm vụ của bạn là vẽ hai đường thẳng vuông góc sao cho không có mỏ vàng nào nằm trên biên giới, và các biên giới chia đều các mỏ vàng.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo. Mỗi bộ test bắt đầu bằng một số \(N\), mô tả số lượng mỏ vàng mà mỗi người con nên nhận được. \(4N\) dòng tiếp theo, mỗi dòng chứa hai số nguyên, là tọa độ \(x_i, y_i\) của một trong các mỏ vàng. Không có ba mỏ vàng nào thẳng hàng.

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất ra một dòng chứa "Case #x: \(x_a\) \(y_a\) \(x_b\) \(y_b\)", trong đó \(x\) là số thứ tự bộ test (bắt đầu từ 1), (\(x_a, y_a\)) là tọa độ của điểm giao nhau của hai biên giới, và (\(x_b, y_b\)) là tọa độ của một điểm khác trên chữ X.

Tất cả các tọa độ phải nằm trong khoảng \(-10^9\)\(10^9\), có tối đa 9 chữ số sau dấu phẩy thập phân và không sử dụng ký hiệu lũy thừa (exponential notation). Chúng phải chính xác: chữ X kết quả sẽ được vẽ chính xác tại các tọa độ này. Bạn nên xuất ra IMPOSSIBLE nếu không có cách đặt biên giới nào phù hợp.

Ràng buộc

  • \(1 \le T \le 20\)
  • \(-10^6 \le x_i, y_i \le 10^6\)

Phân nhóm

  • Small dataset (Test set 1 - Visible): \(1 \le N \le 10\).
  • Large dataset (Test set 2 - Hidden): \(1 \le N \le 2500\).

Đ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 10/39 25,64%
Test Set 2 29/39 74,36%

Ví dụ

Ví dụ 1

Input
2
1
0 0
1 0
0 1
1 1
1
1 0
0 1
-1 0
0 -1
Output
Case #1: 0.5 0.5 2 0.5
Case #2: 0 0 -3 -3

Nguồn

Google Code Jam 2013, Chung kết thế giới, bài X Marks the Spot.

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