canuc80k6408·9/50

Ghép Cặp Ổn Định

Nộp bài trên LQDOJ

Bài 64 · Matching

Có hai nhóm, mỗi nhóm gồm người. Ta gọi các thành viên của nhóm thứ nhất là , còn các thành viên của nhóm thứ hai là . Mỗi người xếp hạng toàn bộ thành viên của nhóm còn lại theo thứ tự yêu thích, từ cao xuống thấp. Không có hai người cùng hạng trong một danh sách.

Hãy ghép mỗi người của nhóm với đúng một người của nhóm sao cho phép ghép ổn định.

Một cặp được gọi là cặp gây bất ổn nếu và không đang được ghép với nhau, đồng thời:

  • thích hơn người đang ghép với mình;
  • thích hơn người đang ghép với mình.

Một phép ghép là ổn định khi không tồn tại cặp gây bất ổn.

Input

  • Dòng đầu chứa số bộ test .
  • Mỗi bộ test có dạng:
  • Dòng đầu chứa số nguyên .
  • dòng tiếp theo mô tả thứ tự yêu thích của nhóm . Mỗi dòng bắt đầu bằng chỉ số , sau đó là một hoán vị của , cho biết xếp các thành viên nhóm theo thứ tự từ thích nhất đến ít thích nhất.
  • dòng tiếp theo mô tả thứ tự yêu thích của nhóm theo cách tương tự. Mỗi dòng bắt đầu bằng chỉ số , sau đó là một hoán vị của gồm các chỉ số của nhóm .

  • Các dòng mô tả trong mỗi nhóm không nhất thiết xuất hiện theo thứ tự chỉ số.

Output

  • Với mỗi bộ test, in đúng dòng. Mỗi dòng chứa hai số nguyên , nghĩa là được ghép với .

  • Mỗi chỉ số của hai nhóm phải xuất hiện đúng một lần. Không in dòng trống hoặc ký hiệu phân cách giữa hai bộ test. Nếu có nhiều phép ghép ổn định, bạn có thể in bất kỳ phép ghép nào.

Constraints

  • .
  • trong mỗi bộ test.
  • Mỗi danh sách yêu thích là một hoán vị đầy đủ của .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

1
3
1 2 1 3
2 1 2 3
3 1 2 3
1 1 2 3
2 1 2 3
3 2 3 1

Output

1 2
2 1
3 3

Giải thích: được ghép với với , còn với . Kiểm tra từng cặp chưa ghép cho thấy không có hai người nào cùng muốn bỏ đối tác hiện tại để ghép với nhau, nên phép ghép này ổn định.

Lời giải tóm tắt
  • Ý tưởng: Cho các thành viên nhóm A lần lượt đề nghị ghép cặp theo danh sách yêu thích của mình. Mỗi thành viên nhóm B tạm giữ lời đề nghị tốt nhất đã nhận và từ chối những lời đề nghị kém hơn. Người bị từ chối tiếp tục đề nghị người kế tiếp trong danh sách.
  • Ý tưởng: Ta tiền xử lý rankB[b][a], là vị trí của Aa trong danh sách của Bb, để so sánh hai lời đề nghị trong O(1).
  • Chứng minh tính đúng đắn: Mỗi lần một thành viên B đổi người đang giữ, họ chỉ đổi sang người mình thích hơn. Mỗi thành viên A đề nghị theo đúng thứ tự giảm dần mức yêu thích và không bao giờ đề nghị cùng một người hai lần, nên thuật toán kết thúc sau nhiều nhất n² lời đề nghị. Khi kết thúc, mọi thành viên A đều được ghép; do mỗi B giữ tối đa một lời đề nghị, kết quả là một phép ghép hoàn hảo.
  • Chứng minh tính đúng đắn: Giả sử kết quả còn cặp gây bất ổn (Aa, Bb). Vì Aa thích Bb hơn người đang ghép với mình, Aa đã từng đề nghị Bb trước. Bb đã từ chối Aa, hoặc về sau thay Aa bằng một người được thích hơn. Do lựa chọn tạm giữ của B chỉ tốt dần, ở cuối Bb thích người đang ghép ít nhất bằng Aa, mâu thuẫn với việc (Aa, Bb) gây bất ổn. Vậy phép ghép thu được ổn định.
  • Độ phức tạp: Mỗi cặp có thể tạo nhiều nhất một lời đề nghị, nên thời gian là O(n²) và bộ nhớ là O(n²) cho mỗi bộ test.