private Map<Integer, Integer> tree;//线段树,表示某节点的值
private Map<Integer, Integer> lazy;//懒标记
private int N;//最大范围
public MyCalendarThree() {
tree = new HashMap<>();
lazy = new HashMap<>();
N= (int)1e9;
}
//区间修改(增加)
public void update(int l,int r,int val){
if(l>r) return;
update(l,r,1,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) +val);//更新当前节点
if(curl<curr) lazy.put(node, lazy.getOrDefault(node, 0) + val);
} 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.getOrDefault(node,0);
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,1,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 int book(int start, int end) {
update(start,end-1,1);
return query(1,N);
}
2022.6.6-----leetcode.732
最新推荐文章于 2024-07-27 13:31:57 发布