canuc80k0904·5/50

Vé Trong Tầm Giá

Nộp bài trên LQDOJ

Bài 09 · C++ STL

Với mỗi khách theo thứ tự đến, bán vé đắt nhất không vượt quá ngân sách của khách; mỗi vé chỉ được bán một lần.

Input

  • Dòng đầu chứa và .
  • Dòng thứ hai chứa giá vé .
  • Dòng thứ ba chứa ngân sách theo thứ tự khách đến.

Output

  • Với mỗi khách, in giá vé được bán; nếu không còn vé phù hợp thì in .

Constraints

  • .
  • .

Scoring

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

Example

Test 1

Input

6 5
4 8 8 3 10 6
5 8 2 10 8

Output

4
8
-1
10
8

Giải thích: Các khách lần lượt nhận vé giá , không có vé phù hợp, rồi nhận và bản sao còn lại. Mỗi vé đã bán được xóa khỏi kho.

Lời giải tóm tắt
  • Phân tích: Với mỗi khách theo thứ tự đến, bán vé đắt nhất không vượt quá ngân sách của khách; mỗi vé chỉ được bán một lần. Cấu trúc dữ liệu chuẩn trong topic cho phép duy trì đúng thông tin cần thiết mà không phải duyệt lại toàn bộ trạng thái sau mỗi bước.
  • Thuật toán: Lưu toàn bộ giá trong multiset. Với ngân sách x, upper_bound(x) trỏ tới giá đầu tiên lớn hơn x; lùi một bước sẽ được vé đắt nhất hợp lệ, sau đó xóa đúng iterator đó.
  • Chứng minh tính đúng đắn: Mọi vé đứng trước upper_bound(x) đều không vượt quá ngân sách, và phần tử ngay trước nó là lớn nhất trong nhóm này. Nếu iterator đang ở begin() thì không có vé hợp lệ. Xóa đúng một bản sao bảo toàn chính xác kho vé cho các khách sau.
  • Độ phức tạp: Thời gian O((n+m) log n), bộ nhớ O(n).