classAllocator:def__init__(self,n:int):self.m=[0]*ndefallocate(self,size:int,mID:int)->int:cnt=0fori,vinenumerate(self.m):ifv:cnt=0else:cnt+=1ifcnt==size:self.m[i-size+1:i+1]=[mID]*sizereturni-size+1return-1deffree(self,mID:int)->int:ans=0fori,vinenumerate(self.m):ifv==mID:self.m[i]=0ans+=1returnans# Your Allocator object will be instantiated and called as such:# obj = Allocator(n)# param_1 = obj.allocate(size,mID)# param_2 = obj.free(mID)
classAllocator{privateint[]m;publicAllocator(intn){m=newint[n];}publicintallocate(intsize,intmID){intcnt=0;for(inti=0;i<m.length;++i){if(m[i]>0){cnt=0;}elseif(++cnt==size){Arrays.fill(m,i-size+1,i+1,mID);returni-size+1;}}return-1;}publicintfree(intmID){intans=0;for(inti=0;i<m.length;++i){if(m[i]==mID){m[i]=0;++ans;}}returnans;}}/** * Your Allocator object will be instantiated and called as such: * Allocator obj = new Allocator(n); * int param_1 = obj.allocate(size,mID); * int param_2 = obj.free(mID); */
classAllocator{public:Allocator(intn){m=vector<int>(n);}intallocate(intsize,intmID){intcnt=0;for(inti=0;i<m.size();++i){if(m[i]){cnt=0;}elseif(++cnt==size){fill(i-size+1,i+1,mID);returni-size+1;}}return-1;}intfree(intmID){intans=0;for(inti=0;i<m.size();++i){if(m[i]==mID){m[i]=0;++ans;}}returnans;}private:vector<int>m;voidfill(intfrom,intto,intval){for(inti=from;i<to;++i){m[i]=val;}}};/** * Your Allocator object will be instantiated and called as such: * Allocator* obj = new Allocator(n); * int param_1 = obj->allocate(size,mID); * int param_2 = obj->free(mID); */
typeAllocatorstruct{m[]int}funcConstructor(nint)Allocator{returnAllocator{make([]int,n)}}func(this*Allocator)Allocate(sizeint,mIDint)int{cnt:=0fori,v:=rangethis.m{ifv>0{cnt=0}else{cnt++ifcnt==size{forj:=i-size+1;j<=i;j++{this.m[j]=mID}returni-size+1}}}return-1}func(this*Allocator)Free(mIDint)(ansint){fori,v:=rangethis.m{ifv==mID{this.m[i]=0ans++}}return}/** * Your Allocator object will be instantiated and called as such: * obj := Constructor(n); * param_1 := obj.Allocate(size,mID); * param_2 := obj.Free(mID); */
fromsortedcontainersimportSortedListclassAllocator:def__init__(self,n:int):self.sl=SortedList([(-1,-1),(n,n)])self.d=defaultdict(list)defallocate(self,size:int,mID:int)->int:for(_,s),(e,_)inpairwise(self.sl):s,e=s+1,e-1ife-s+1>=size:self.sl.add((s,s+size-1))self.d[mID].append((s,s+size-1))returnsreturn-1deffree(self,mID:int)->int:ans=0forblockinself.d[mID]:self.sl.remove(block)ans+=block[1]-block[0]+1delself.d[mID]returnans# Your Allocator object will be instantiated and called as such:# obj = Allocator(n)# param_1 = obj.allocate(size,mID)# param_2 = obj.free(mID)
classAllocator{privateTreeMap<Integer,Integer>tm=newTreeMap<>();privateMap<Integer,List<Integer>>d=newHashMap<>();publicAllocator(intn){tm.put(-1,-1);tm.put(n,n);}publicintallocate(intsize,intmID){ints=-1;for(varentry:tm.entrySet()){intv=entry.getKey();if(s!=-1){inte=v-1;if(e-s+1>=size){tm.put(s,s+size-1);d.computeIfAbsent(mID,k->newArrayList<>()).add(s);returns;}}s=entry.getValue()+1;}return-1;}publicintfree(intmID){intans=0;for(ints:d.getOrDefault(mID,Collections.emptyList())){inte=tm.remove(s);ans+=e-s+1;}d.remove(mID);returnans;}}/** * Your Allocator object will be instantiated and called as such: * Allocator obj = new Allocator(n); * int param_1 = obj.allocate(size,mID); * int param_2 = obj.free(mID); */
classAllocator{public:Allocator(intn){tm[-1]=-1;tm[n]=n;}intallocate(intsize,intmID){ints=-1;for(auto&[v,c]:tm){if(s!=-1){inte=v-1;if(e-s+1>=size){tm[s]=s+size-1;d[mID].emplace_back(s);returns;}}s=c+1;}return-1;}intfree(intmID){intans=0;for(int&s:d[mID]){inte=tm[s];tm.erase(s);ans+=e-s+1;}d.erase(mID);returnans;}private:map<int,int>tm;unordered_map<int,vector<int>>d;};/** * Your Allocator object will be instantiated and called as such: * Allocator* obj = new Allocator(n); * int param_1 = obj->allocate(size,mID); * int param_2 = obj->free(mID); */
typeAllocatorstruct{rbt*redblacktree.Treedmap[int][]int}funcConstructor(nint)Allocator{rbt:=redblacktree.NewWithIntComparator()rbt.Put(-1,-1)rbt.Put(n,n)returnAllocator{rbt,map[int][]int{}}}func(this*Allocator)Allocate(sizeint,mIDint)int{s:=-1it:=this.rbt.Iterator()forit.Next(){v:=it.Key().(int)ifs!=-1{e:=v-1ife-s+1>=size{this.rbt.Put(s,s+size-1)this.d[mID]=append(this.d[mID],s)returns}}s=it.Value().(int)+1}return-1}func(this*Allocator)Free(mIDint)int{ans:=0for_,s:=rangethis.d[mID]{ife,ok:=this.rbt.Get(s);ok{this.rbt.Remove(s)ans+=e.(int)-s+1}}this.d[mID]=[]int{}returnans}/** * Your Allocator object will be instantiated and called as such: * obj := Constructor(n); * param_1 := obj.Allocate(size,mID); * param_2 := obj.Free(mID); */