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] Mô phỏng cấp phát bộ nhớ theo hệ buddy (buddy system)

    Hệ thống cấp phát buddy (buddy system) quản lý một vùng nhớ kích thước 2K2^K2K byte (địa chỉ 0..2K−10..2^K-10..2K−1). Bộ nhớ luôn được chia thành các khối có kích thước là lũy thừa của 2; một khối bậc (order) kkk có kích thước 2k2^k2k byte. Ban đầu có một khối trống duy nhất ở bậc KKK.

    Cho mmm yêu cầu:

    • ALLOC id size: cấp phát sizesizesize byte cho đối tượng ididid. Tìm bậc nhỏ nhất kkk sao cho 2k≥size2^k \ge size2k≥size (nếu k>Kk > Kk>K thì thất bại luôn). Nếu đang có khối trống ở đúng bậc kkk, lấy khối có địa chỉ nhỏ nhất trong số đó. Nếu không có, tìm bậc jjj nhỏ nhất thoả j>kj > kj>k và đang có khối trống ở bậc jjj (lấy khối địa chỉ nhỏ nhất ở bậc đó); nếu không tồn tại bậc nào ≥k\ge k≥k còn khối trống, cấp phát thất bại. Nếu tìm được khối bậc j>kj > kj>k, tách (split) liên tục: mỗi lần tách một khối bậc ttt thành hai khối "buddy" bậc t−1t-1t−1 nằm liền kề nhau (khối có địa chỉ nhỏ hơn giữ nguyên vị trí để tiếp tục tách hoặc cấp phát; khối có địa chỉ lớn hơn trở thành khối trống mới ở bậc t−1t-1t−1), lặp lại cho tới khi đạt bậc kkk, rồi cấp khối bậc kkk đó cho ididid.
    • FREE id: giải phóng khối đã cấp cho ididid về trạng thái khối trống ở đúng bậc kkk mà nó đã được cấp. Sau đó gộp (merge) liên tục với buddy của nó — khối cùng bậc kkk có địa chỉ bằng addr⊕2kaddr \oplus 2^kaddr⊕2k (XOR bit) — nếu buddy đó cũng đang là khối trống nguyên vẹn ở bậc kkk: hai khối gộp thành một khối trống bậc k+1k+1k+1 (địa chỉ là địa chỉ nhỏ hơn trong hai buddy), rồi tiếp tục thử gộp lên bậc cao hơn, cho tới khi buddy không trống hoặc đã đạt bậc KKK.
    Input:
    3 5
    ALLOC A 3
    ALLOC B 3
    ALLOC C 1
    FREE A
    ALLOC C 1
    
    Output:
    OK A 0 2
    OK B 4 2
    FAIL C
    OK C 0 0
    
    • Định dạng đầu vào:

      Dòng 1: hai số nguyên KKK và mmm (0≤K≤200 \le K \le 200≤K≤20, 0≤m≤20000 \le m \le 20000≤m≤2000). mmm dòng tiếp theo, mỗi dòng là lệnh ALLOC id size hoặc FREE id (ididid là một token không chứa khoảng trắng và duy nhất tại mỗi thời điểm đang được cấp phát; 1≤size≤2K1 \le size \le 2^K1≤size≤2K).

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

      Với mỗi lệnh ALLOC, theo đúng thứ tự xuất hiện, in một dòng: OK id addr order nếu thành công (addraddraddr là địa chỉ bắt đầu khối được cấp, orderorderorder là bậc kkk của khối đó — tức khối có kích thước 2k2^k2k byte), hoặc FAIL id nếu thất bại. Lệnh FREE không in gì.

    Ví dụ:

    Đầu vào:

    3 5
    ALLOC A 3
    ALLOC B 3
    ALLOC C 1
    FREE A
    ALLOC C 1
    

    Đầu ra:

    OK A 0 2
    OK B 4 2
    FAIL C
    OK C 0 0
    

    Đầu vào:

    2 3
    ALLOC X 4
    ALLOC Y 1
    FREE X
    

    Đầu ra:

    OK X 0 2
    FAIL Y
    

    Đang tải editor...