返回题解分享
讨论 / 题解分享/ 帖子详情

操作系统 - 题解

#include<bits/stdc++.h>
using namespace std;

const int maxn = 20100;

int n,q;
int rem;

struct Fmem{
    int l,r;
}fmem[maxn];

int num;

struct Used{
    int l,r;
    int id;
    bool operator <(const Used &beta) const{
        return l < beta.l;
    }
};

set <Used> s;

int fnum;

int bestfit(int p,int len){
    int near = 0;
    for(int i=1;i<=fnum;i++){
        int flen = fmem[i].r - fmem[i].l+1;
        if(flen >= len){
            if(near == 0 || (fmem[near].r-fmem[near].l+1) > flen || ((fmem[near].r-fmem[near].l+1) == flen && fmem[near].l > fmem[i].l)){
                near = i;
            }
        }
    }
    
    if(near == 0) return 0;
    else {
        rem -= len;
        cout<<fmem[near].l<<'\n';
        s.insert((Used){fmem[near].l,fmem[near].l+len-1,p});
        fmem[near].l = fmem[near].l+len;
        return 1;
    }
}

void compact(int p,int lp){
    int now = 1;
    for(set<Used>::iterator it = s.begin();it != s.end();it++){
        int len = (*it).r-(*it).l + 1;
        Used nw = (Used){now,now+len-1,(*it).id};
        s.erase(it);s.insert(nw);
        it = s.find(nw);
        now += len;
    }
    rem -= lp;
    fnum = 0;
    cout<<now<<'\n';
    s.insert((Used){now,now+lp-1,p});
    now += lp;
    fmem[++fnum] = (Fmem){now,n};
}

int cmp(Fmem alpha,Fmem beta){
    return alpha.l < beta.l;
}

void release(int p){
    for(set<Used>::iterator it = s.begin();it != s.end();it++){
        if((*it).id == p){
            rem += (*it).r - (*it).l+1;
            fmem[++fnum] = (Fmem){(*it).l,(*it).r};
            cout<<(*it).l<<'\n';
            s.erase(it);
            break;
        }
    }
    sort(fmem+1,fmem+fnum+1,cmp);
    int fp = 0;
    for(int i=1;i<=fnum;i++){
        if(fmem[i].l > fmem[i].r) continue;
        if(fmem[i].l == fmem[fp].r+1 && fp != 0){
            fmem[fp].r = fmem[i].r;
        }else{
            fp++;
            fmem[fp] = fmem[i];
        }
    }
    fnum = fp;
}

int main(){
    cin >> n >> q;
    rem = n;
    fmem[++fnum] = (Fmem){1,n};
    for(int i=1;i<=q;i++){
        int x,y; cin >> x >> y;
        if(x == 1){
            num++;
            if(bestfit(num,y))continue;
            if(rem < y){
                cout<<"Fail\n";
            }else compact(num,y);
        }else{
            release(y);
        }
    }
}
0 回复 0 转发 0 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!