codeforces 7B

B. Memory Manager
time limit per test
1 second
memory limit per test
64 megabytes
input
standard input
output
standard output

There is little time left before the release of the first national operating system BerlOS. Some of its components are not finished yet — the memory manager is among them. According to the developers' plan, in the first release the memory manager will be very simple and rectilinear. It will support three operations:

  • alloc n — to allocate n bytes of the memory and return the allocated block's identifier x;
  • erase x — to erase the block with the identifier x;
  • defragment — to defragment the free memory, bringing all the blocks as close to the beginning of the memory as possible and preserving their respective order;

The memory model in this case is very simple. It is a sequence of m bytes, numbered for convenience from the first to the m-th.

The first operation alloc n takes as the only parameter the size of the memory block that is to be allocated. While processing this operation, a free block of n successive bytes is being allocated in the memory. If the amount of such blocks is more than one, the block closest to the beginning of the memory (i.e. to the first byte) is prefered. All these bytes are marked as not free, and the memory manager returns a 32-bit integer numerical token that is the identifier of this block. If it is impossible to allocate a free block of this size, the function returns NULL.

The second operation erase x takes as its parameter the identifier of some block. This operation frees the system memory, marking the bytes of this block as free for further use. In the case when this identifier does not point to the previously allocated block, which has not been erased yet, the function returns ILLEGAL_ERASE_ARGUMENT.

The last operation defragment does not have any arguments and simply brings the occupied memory sections closer to the beginning of the memory without changing their respective order.

In the current implementation you are to use successive integers, starting with 1, as identifiers. Each successful alloc operation procession should return following number. Unsuccessful alloc operations do not affect numeration.

You are to write the implementation of the memory manager. You should output the returned value for each alloc command. You should also output ILLEGAL_ERASE_ARGUMENT for all the failed erase commands.

Input

The first line of the input data contains two positive integers t and m (1 ≤ t ≤ 100;1 ≤ m ≤ 100), where t — the amount of operations given to the memory manager for processing, and m — the available memory size in bytes. Then there follow t lines where the operations themselves are given. The first operation is alloc n (1 ≤ n ≤ 100), where n is an integer. The second one is erase x, where x is an arbitrary 32-bit integer numerical token. The third operation is defragment.

Output

Output the sequence of lines. Each line should contain either the result of alloc operation procession , or ILLEGAL_ERASE_ARGUMENT as a result of failed erase operation procession. Output lines should go in the same order in which the operations are processed. Successful procession of alloc operation should return integers, starting with 1, as the identifiers of the allocated blocks.

Examples
Input
6 10
alloc 5
alloc 3
erase 1
alloc 6
defragment
alloc 6
Output
1
2
NULL
3

一道纯模拟题,模拟内存分配过程。(os的首次适应算法
a:从前往后寻找一个满足大小的内存空间,放进去并给个编号(编号一直累加
e:清空给定编号的空间
d:把所有内存块移到最前面,空闲块都存在最后面了。

这题有两个大坑:1.内存块移到前面时不改变顺序,这个顺序不是编号的顺序,而是他们内存块的位置顺序。2.不合理编号的处理要细心点。

附ac代码:
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <string>
  4 #include <iostream>
  5 #include <algorithm>
  6 using namespace std;
  7 string op;
  8 int mem[111];
  9 int idm[111];
 10 struct nod
 11 {
 12     int st;
 13     int ed;
 14     int id;
 15 }nd[111];
 16 bool cmp(nod a,nod b)
 17 {
 18     if(a.st<b.st) return 1;
 19     return 0;
 20 }
 21 int main()
 22 {
 23     ios::sync_with_stdio(false);
 24     cin.tie(0);
 25     cout.tie(0);
 26     int t,m;
 27     cin>>t>>m;
 28     for(int i=1;i<=111;++i)
 29     nd[i].id=i;
 30 
 31     int u,id=1;
 32     for(int i=1;i<=t;++i)
 33     {
 34 
 35         cin>>op;
 36         if(op[0]=='a')
 37         {
 38             cin>>u;
 39 
 40 
 41             int j=1,sum=0;
 42       //      cout<<"m:"<<mem[1]<<endl;
 43             for(j=1;j<=m;++j)
 44             {
 45                 if(mem[j]==0)
 46                 {
 47                     sum++;
 48                 }
 49                 else
 50                 {
 51                     sum=0;
 52                 }
 53                 if(sum==u)
 54                 {
 55                     int k=j;
 56                     while(sum!=0)
 57                     {
 58                         mem[k-sum+1]=1;
 59                         sum--;
 60                     }
 61                     break;
 62                 }
 63             }
 64             if(j==m+1) cout<<"NULL"<<endl;
 65             else
 66             {
 67                 cout<<id<<endl;
 68                 idm[id]=1;
 69                 nd[id].st=j-u+1;
 70 
 71                 nd[id++].ed=j;
 72         //        cout<<nd[id-1].st<<nd[id-1].ed<<endl;
 73             }
 74         }
 75         else if(op[0]=='e')
 76         {
 77             cin>>u;
 78             if(u<0 || u>id || idm[u]==0)
 79             {
 80                 cout<<"ILLEGAL_ERASE_ARGUMENT"<<endl;
 81             }
 82             else
 83             {
 84           //      cout<<nd[id-1].st<<nd[id-1].ed<<endl;
 85                 idm[u]=0;
 86                 for(int k=1;k<id;++k)
 87                 {
 88 
 89                     if(nd[k].id==u)
 90                     {
 91 
 92                         for(int j=nd[k].st;j<=nd[k].ed;++j)
 93                         {
 94 
 95                             mem[j]=0;
 96                         }
 97                     }
 98                 }
 99 
100             }
101         }
102         else
103         {
104             int sum=0,x=1;
105             for(int k=1;k<=m;++k)
106             {
107                 if(mem[k]==1)
108                     sum++;
109             }
110             memset(mem,0,sizeof(mem));
111             for(int k=1;k<=sum;++k)
112                 mem[k]=1;
113             sort(nd+1,nd+id,cmp);
114             for(int k=1;k<id;++k)
115             {
116 
117                 if(idm[nd[k].id]==1)
118                 {
119                //     cout<<nd[k].id<<endl;
120                     int len=nd[k].ed-nd[k].st+1;
121                     nd[k].st=x;
122                     nd[k].ed=x+len-1;
123                     x=nd[k].ed+1;
124                //     cout<<nd[k].st<<nd[k].ed<<endl;
125                 }
126             }
127         }
128     }
129     return 0;
130 }
View Code

 

posted @ 2017-11-12 18:16  euzmin  阅读(271)  评论(0编辑  收藏  举报