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] Cấp phát bộ nhớ theo hệ thống Buddy (Buddy System)

    Hệ thống buddy quản lý một vùng nhớ kích thước 2k2^k2k byte bằng cách chia đôi đệ quy: một khối kích thước 2e2^{e}2e có thể tách thành hai khối "buddy" kích thước 2e−12^{e-1}2e−1 đặt liên tiếp. Khi cấp phát sizesizesize byte, kích thước thực tế được làm tròn lên thành lũy thừa của 222 nhỏ nhất ≥size\ge size≥size (gọi bậc e=log⁡2e = \log_2e=log2​ của kích thước đó). Ban đầu chỉ có một khối trống duy nhất, bậc kkk, tại địa chỉ 000.

    Có QQQ thao tác:

    • ALLOC size: tính bậc cần thiết eee (nhỏ nhất sao cho 2e≥size2^e \ge size2e≥size). Tìm khối trống bậc f≥ef \ge ef≥e nhỏ nhất hiện có (nếu nhiều khối cùng bậc fff, chọn khối địa chỉ nhỏ nhất); nếu f=ef=ef=e thì cấp phát luôn khối đó; nếu f>ef>ef>e, tách khối liên tục thành hai nửa bậc f−1f-1f−1: giữ nửa địa chỉ thấp hơn để tiếp tục tách (nếu cần), đưa nửa còn lại vào danh sách khối trống bậc f−1f-1f−1, lặp lại tới khi đạt bậc eee, rồi cấp phát khối địa chỉ thấp đó. Nếu không có khối trống bậc ≥e\ge e≥e nào (kể cả xét hết tới bậc kkk), in FAIL. Mỗi lần ALLOC thành công được gán id tăng dần 1,2,3,…1,2,3,\dots1,2,3,….
    • FREE id: giải phóng khối đã cấp cho lần ALLOC thành công thứ ididid. Đưa khối về danh sách trống ở đúng bậc của nó, sau đó hợp nhất liên tiếp với "buddy" của nó (địa chỉ buddy = địa chỉ hiện tại XOR 2bậc2^{bậc}2bậc) nếu buddy đó cũng đang trống và cùng bậc — hợp nhất thành khối bậc cao hơn 111, tiếp tục thử hợp nhất lên các bậc cao hơn cho tới khi không thể hoặc đạt bậc kkk. FREE không tạo output.

    Yêu cầu: với mỗi ALLOC, in địa chỉ cấp phát hoặc FAIL.

    Ví dụ: k=4k=4k=4 (vùng nhớ 161616 byte). ALLOC 3 (cần bậc 222, tức 444 byte): tách 16→8+816 \to 8+816→8+8, tách tiếp 8→4+48 \to 4+48→4+4, cấp tại địa chỉ 0\mathbf{0}0 (còn dư khối trống bậc 222 tại địa chỉ 444 và bậc 333 tại địa chỉ 888).

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

      Dòng 1: kkk (0≤k≤300 \le k \le 300≤k≤30) — vùng nhớ kích thước 2k2^k2k byte. Dòng 2: QQQ (0≤Q≤5000 \le Q \le 5000≤Q≤500). QQQ dòng: ALLOC size (1≤size≤2301 \le size \le 2^{30}1≤size≤230) hoặc FREE id.

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

      Với mỗi ALLOC, một dòng là địa chỉ cấp phát hoặc FAIL.

    Ví dụ:

    Đầu vào:

    4
    8
    ALLOC 3
    ALLOC 4
    ALLOC 8
    ALLOC 1
    FREE 1
    FREE 2
    FREE 3
    ALLOC 16
    

    Đầu ra:

    0
    4
    8
    FAIL
    0
    

    Đầu vào:

    0
    4
    ALLOC 1
    ALLOC 1
    FREE 1
    ALLOC 1
    

    Đầu ra:

    0
    FAIL
    0
    

    Đang tải editor...