Hướng dẫn cho LQDOJ Cup 2023 - Round 6 - Team


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: bin9638

Subtask 1 <Đệ quy>

  • Ta duyệt tất cả các cách chia có thể, với mỗi cách chia kiểm tra xem có thỏa mãn không.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(2^n * n)\)

Subtask 2 <Duyệt trâu>

  • Gọi \(dp_i\) là số cách xếp nhóm cho \(i\) học sinh ban đầu, ta duyệt hết tất cả các đoạn con liên tiếp \(u-v\) theo \(v\) tăng dần, nếu đoạn con đó thỏa mãn điều kiện thì tăng \(dp_v\) lên một lượng \(dp_{u-1}\).
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n^3)\)

Subtask 3 <Cải tiến>

  • Với mỗi \(v\) ta duyệt \(u\) giảm dần từ \(v\) về \(1\) và dùng một mảng đếm để kiểu tra xem đoạn \(u-v\) có thỏa mãn không.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n^2)\)

Subtask 4 <Cấu trúc dữ liệu>

  • Ta nhận thấy với mỗi \(v\) thì những \(u\) để đoạn \(u-v\) thỏa mãn sẽ nằm liên tiếp nhau, ta sẽ tìm vị trí đầu và cuối của đoạn liên tiếp nằm, gọi lần lượt là \(A\) và \(B\).
  • Khi ta tăng \(v\) thì \(A\) và \(B\) cũng sẽ tăng theo, ta sẽ dùng \(2\) mảng đếm và tịnh tiến \(A\) và \(B\) cho đến khi thỏa mãn điều kiện.
  • Dùng mảng cộng dồn để tính tổng \(dp_A + dp_{A+1} + ... + dp_B\) trong \(O(1)\).
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n)\)

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.