cpp-011Đọc toàn bộ đề miễn phí

Quản lý đa tập hợp số nguyên động

Hệ thống sàn giao dịch thẻ bài huấn luyện AI của AI Empire Academy quản lý một kho dữ liệu chứa các giá trị sức mạnh của các thẻ bài. Kho dữ liệu bắt đầu với trạng thái rỗng.

C++Nâng cao35 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

setmultisetbinary search treedata structures

Kiến thức tiên quyết: std multiset, iterators, fast io.

Nội dung đề bài

Mục tiêu kiến thức

  • Sử dụng cấu trúc Cây đỏ đen cân bằng std::multiset trong C++ để lưu trữ tập hợp có phần tử trùng nhau.
  • Phân biệt thao tác xóa một bản sao duy nhất (s.erase(s.find(x))) và xóa toàn bộ các phần tử có giá trị bằng X (s.erase(x)).
  • Sử dụng phương thức thành viên s.lower_bound(x) với độ phức tạp O(log N).
  • Kỹ thuật dịch chuyển iterator bằng std::prev() để tìm phần tử lớn nhất ≤ X.

Mô tả bài toán

Hệ thống sàn giao dịch thẻ bài huấn luyện AI của AI Empire Academy quản lý một kho dữ liệu chứa các giá trị sức mạnh của các thẻ bài. Kho dữ liệu bắt đầu với trạng thái rỗng.

Bạn cần xử lý lần lượt Q truy vấn thuộc 4 loại sau (1 ≤ Q ≤ 105):

  • 1 X: Thêm một thẻ bài có giá trị X vào kho.
  • 2 X: Xóa đúng một thẻ bài có giá trị X khỏi kho (nếu trong kho có nhiều thẻ bài giá trị X, chỉ xóa 1 bản sao; nếu không có thẻ bài nào giá trị X, bỏ qua thao tác này).
  • 3 X: Tìm cận trên: Tìm và in ra giá trị thẻ bài nhỏ nhất trong kho có giá trị ≥ X. Nếu kho không có thẻ bài nào ≥ X, in -1.
  • 4 X: Tìm cận dưới: Tìm và in ra giá trị thẻ bài lớn nhất trong kho có giá trị ≤ X. Nếu kho không có thẻ bài nào ≤ X, in -1.

Quy ước nộp bài

  • Chỉ cần viết một chương trình đọc stdin và in ra stdout. Bài này không yêu cầu viết hàm.
  • Không dùng cout để in lời nhắc trước khi đọc dữ liệu. Lời nhắc sẽ lọt vào stdout và làm bài sai.
  • Chỉ in đúng nội dung ở mục Output. Không in thêm nhãn, dòng trống hay ký tự thừa.
  • Output được so khớp từng ký tự, phân biệt chữ hoa/thường và dấu câu.

Input

  • Dòng 1: Một số nguyên dương Q (1 ≤ Q ≤ 105).
  • Q dòng tiếp theo: Mỗi dòng chứa 2 số nguyên đại diện cho một truy vấn: type X (1 ≤ type ≤ 4, -109 ≤ X ≤ 109).

Output

Với mỗi truy vấn loại 3 và loại 4, in kết quả trên một dòng.

Ràng buộc

  • 1 ≤ Q ≤ 105.
  • -109 ≤ X ≤ 109.
  • Thời gian chạy: 1000ms.
  • Bộ nhớ tối đa: 256MB.

Ví dụ 1

Input

8
1 10
1 20
1 10
3 10
4 15
2 10
3 10
4 5

Output

10
10
10
-1

Giải thích

  • Thêm 10, 20, 10 → Kho: {10, 10, 20}.
  • 3 10: Phần tử nhỏ nhất ≥ 10 là 10.
  • 4 15: Phần tử lớn nhất ≤ 15 là 10.
  • 2 10: Xóa 1 bản sao của 10 → Kho còn: {10, 20}.
  • 3 10: Vẫn còn một số 10 trong kho → in 10.
  • 4 5: Không có phần tử nào ≤ 5 → in -1.
3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.