Untitled
unknown
plain_text
a year ago
2.4 kB
2
Indexable
#include <iostream> #include <set> #include <unordered_map> #include <vector> using namespace std; set <pair<int,int>> khoang_trong; unordered_map<int, int> map_id; vector<pair<int,int>> file[12005]; int cnt; int n; void init(int N) { for(int i=0;i<cnt;i++){ file[i].clear(); } cnt=0; map_id.clear(); khoang_trong.clear(); n=N; khoang_trong.insert(make_pair(1,N)); return; } int add(int mId, int mSize) { if(n<mSize) return -1; map_id[mId]=cnt; int ans=khoang_trong.begin()->first; while(mSize>0){ auto it=khoang_trong.begin(); int st=(*it).first; int e=(*it).second; khoang_trong.erase(it); int vang=e-st+1; if(vang<mSize) { mSize-=vang; file[cnt].push_back(make_pair(st,e)); n-=vang; } else if(vang==mSize){ n-=vang; file[cnt].push_back(make_pair(st,e)); break; } else{ n-=mSize; file[cnt].push_back(make_pair(st,st+mSize-1)); khoang_trong.insert(make_pair(st+mSize,e)); break; } } cnt++; return ans; } int remove(int mId) { auto it=map_id.find(mId); int id=it->second; map_id.erase(it); int ans; ans=file[id].size(); for(auto i:file[id]){ int st=i.first; int e=i.second; n+=e-st+1; auto it1=khoang_trong.lower_bound(make_pair(st,e)); auto it2=it1; if(it1!=khoang_trong.begin()){ it2--; if(it2->second+1==st){ st=it2->first; khoang_trong.erase(it2); } } if(it1!=khoang_trong.end()){ if(e+1==it1->first){ e=it1->second; khoang_trong.erase(it1); } } khoang_trong.insert(make_pair(st,e)); } file[id].clear(); map_id.erase(mId); return ans; } int count(int mStart, int mEnd) { int ans=0; for(int i=0; i<cnt;i++){ if(!file[i].empty()){ for(auto it:file[i]){ if(it.second<mStart||it.first>mEnd) continue; ans++; break; } } } return ans; }
Editor is loading...