Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Bộ cấp phát Buddy System

    Hệ thống Buddy System quản lý một vùng nhớ kích thước 2K2^K2K đơn vị. Khi cần cấp phát size đơn vị, kích thước thực tế được cấp là lũy thừa của 2 nhỏ nhất ≥\ge≥ size (gọi là bậc/order ooo, kích thước 2o2^o2o). Ban đầu toàn vùng nhớ là MỘT khối trống bậc KKK.

    • Cấp phát bậc ooo: nếu có sẵn khối trống bậc ooo, lấy khối có ĐỊA CHỈ NHỎ NHẤT. Nếu không, tìm khối trống bậc o′>oo' > oo′>o nhỏ nhất hiện có, rồi TÁCH LIÊN TIẾP làm đôi (mỗi lần tách bậc giảm 1, tạo ra 2 khối "buddy" bằng nhau) cho tới khi được khối bậc ooo; nửa còn lại ở mỗi lần tách trở thành khối trống. Nếu không có khối trống nào đủ dùng (kể cả sau khi thử tách), cấp phát THẤT BẠI.
    • Giải phóng: khối được trả về trạng thái trống; sau đó liên tục kiểm tra "buddy" (khối anh em cùng bậc, được ghép với khối này khi tách ra từ khối bậc lớn hơn 1 bậc) — nếu buddy đó ĐANG TRỐNG, hợp nhất hai khối thành một khối trống bậc cao hơn 1, và tiếp tục thử hợp nhất lên các bậc cao hơn cho tới khi buddy không trống hoặc đã đạt bậc KKK.

    Ví dụ: K=4K=4K=4 (vùng nhớ 16 đơn vị). A 1 5 (cần 5 đơn vị ⇒\Rightarrow⇒ bậc 333, kích thước 8) cấp tại địa chỉ 000; A 2 3 (bậc 222, kích thước 4) cấp tại địa chỉ 888; A 3 4 (bậc 222) cấp tại địa chỉ 121212; F 1; A 4 8 (bậc 333) cấp lại tại địa chỉ 000 (khối vừa giải phóng); F 2; F 3 (hai khối bậc 222 liền buddy được hợp nhất thành khối bậc 333 tại địa chỉ 888).

    • Định dạng đầu vào:

      Dòng đầu: hai số nguyên KKK, qqq (0≤K≤200 \le K \le 200≤K≤20, 0≤q≤20000 \le q \le 20000≤q≤2000). qqq dòng tiếp theo, mỗi dòng A id size (1≤1 \le1≤ size ≤2K\le 2^K≤2K, id chưa cấp phát) hoặc F id (id đang được cấp phát).

    • Định dạng đầu ra:

      In qqq dòng kết quả theo thứ tự thao tác: với A id size in địa chỉ bắt đầu (là bội số của 2o2^o2o) nếu thành công, in -1 nếu thất bại; với F id in OK.

      Với ví dụ trên, kết quả là:

      0
      8
      12
      OK
      0
      OK
      OK
      

    Ví dụ:

    Đầu vào:

    4 7
    A 1 5
    A 2 3
    A 3 4
    F 1
    A 4 8
    F 2
    F 3

    Đầu ra:

    0
    8
    12
    OK
    0
    OK
    OK
    

    Đầu vào:

    1 3
    A 1 2
    A 2 1
    A 3 10

    Đầu ra:

    0
    -1
    -1
    

    Đang tải editor...