private Map<Integer, Integer> tree;//线段树,表示某节点表示范围的最大预定数
private Map<Integer, Integer> lazy;//懒标记
private int N;
public MyCalendarTwo() {
tree = new HashMap<Integer, Integer>();
lazy = new HashMap<Integer, Integer>();
N= (int)1e9;
}
//区间修改(增加)
public void update(int l,int r,int val){
if(l>r) return;
update(l,r,0,N,1,val);
}
private void update( int l, int r,int curl, int curr, int node,int val) {
//区间无交集
if (curl>r||curr<l)
return;
//当前区间在目标区间内
if (l<=curl&&curr<=r) {
tree.put(node, tree.getOrDefault(node, 0) +1);//更新当前节点
if(curl<curr) lazy.put(node, lazy.getOrDefault(node, 0) + 1);
} else {//当前区间与目标区间存在交集
int mid = (curl + curr) >> 1;
if(lazy.getOrDefault(node,0)!=0)
pushDown(node);
update( l, r, curl, mid,2 * node,val);
update(l, r, mid+1, curr, 2 * node + 1,val);
tree.put(node, Math.max(tree.getOrDefault(2 * node, 0),tree.getOrDefault(2 * node + 1, 0)));
}
}
//将标记向下一层传递
private void pushDown(int node){
int _lazy=lazy.get(node);
lazy.put(node*2,lazy.getOrDefault(node*2,0)+_lazy);
lazy.put(node*2+1,lazy.getOrDefault(node*2+1,0)+_lazy);
tree.put(node*2,tree.getOrDefault(node*2,0)+_lazy);
tree.put(node*2+1,tree.getOrDefault(node*2+1,0)+_lazy);
lazy.put(node,0);
}
//区间查询
public int query(int l,int r){
if(l>r) return -1;
return query(l,r,0,N,1);
}
private int query(int l,int r,int curl,int curr,int node){
//不在目标区间
if(curl>r||curr<l)
return 0;
//在目标区间
if(l<=curl&&curr<=r)
return tree.getOrDefault(node,0);
//部分有交集,分割区间处理
int mid=(curl+curr)>>1;
if(lazy.getOrDefault(node,0)!=0)
pushDown(node);
return Math.max(query(l,r,curl,mid,node*2),query(l,r,mid+1,curr,node*2+1));
}
public boolean book(int start, int end) {
if(query(start,end-1)<=1){
update(start,end-1,1);
return true;
}
return false;
}