社区讨论

急!0分求调!在线等!

CF7BMemory Manager参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2ecyr3
此快照首次捕获于
2023/10/23 12:27
2 年前
此快照最后确认于
2023/11/03 13:14
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int q , n , x , len;
bool flag;
string s;
struct node{
	int st , ed , used;
	friend bool operator<(node x , node y) {
		if (x.used == y.used) return x.st < y.st;
		return x.used > y.used;
	}
}a[2000005];
int main() {
	scanf("%d %d", &q , &n);
	while(q --) {
		cin >> s;
		if (s == "alloc") {
			scanf("%d", &x);
			sort(a + 1 , a + len + 1);
			if (flag) {
				int L = a[1].ed - a[1].st + 1;
				a[1].st = 1;
				a[1].ed = L;
				for (int i = 2 ; i <= len ; i ++) {
					if (!a[i].used) break;
					int L = a[i].ed - a[i].st + 1;
					a[i].st = a[i - 1].ed + 1;
					a[i].ed = a[i].st + L - 1; 
				}
				flag = 0;
			}
			int last = 0 , tmp = -1;
			for (int i = 1 ; i <= len ; i ++) {
				if (a[i].used) last = i;
				if (!a[i + 1].used) break;
				if (a[i + 1].st - a[i].ed - 1 >= x) {
					tmp = i;
					break;
				}
			}
			if (a[1].st - 1 >= x) tmp = 0;
			if (n - a[last].ed >= x && tmp == -1) tmp = last;
			if (tmp == -1) {
				puts("NULL");
				continue;
			}
			a[++ len].st = a[tmp].ed + 1;
			a[len].used = 1;
			a[len].ed = a[len].st + x - 1;
			printf("%d\n", len);
		} else if (s == "erase") {
			scanf("%d", &x);
			if (!a[x].used) {
				puts("ILLEGAL_ERASE_ARGUMENT");
				continue;
			} 
			a[x].used = 0;
		} else flag = 1;
	}
	return 0;
}
基本思路:
对于每次插入操作,先对当前存储器进行排序,找到能够满足条件的空位并插入,特判第 11 个和最后 11
对于 defragmentdefragment 操作,留到插入操作的时候再处理
对于 eraseerase 操作,直接标记已被删除

回复

1 条回复,欢迎继续交流。

正在加载回复...