You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.3 KiB
113 lines
2.3 KiB
package class_2022_06_3_week;
|
|
|
|
// 测试连接 : https://leetcode.com/problems/range-module/
|
|
// 动态开点线段树的解
|
|
public class Code03_RangeModule2 {
|
|
|
|
// 只提交这个类,可以直接通过
|
|
class RangeModule {
|
|
|
|
DynamicSegmentTree dst;
|
|
|
|
public RangeModule() {
|
|
dst = new DynamicSegmentTree(1000000001);
|
|
}
|
|
|
|
public void addRange(int left, int right) {
|
|
dst.update(left, right - 1, 1);
|
|
}
|
|
|
|
public boolean queryRange(int left, int right) {
|
|
return dst.query(left, right - 1) == right - left;
|
|
}
|
|
|
|
public void removeRange(int left, int right) {
|
|
dst.update(left, right - 1, 0);
|
|
}
|
|
|
|
class Node {
|
|
public int sum;
|
|
public int change;
|
|
public boolean update;
|
|
public Node left;
|
|
public Node right;
|
|
}
|
|
|
|
class DynamicSegmentTree {
|
|
public Node root;
|
|
public int size;
|
|
|
|
public DynamicSegmentTree(int max) {
|
|
root = new Node();
|
|
size = max;
|
|
}
|
|
|
|
private void pushUp(Node c) {
|
|
c.sum = c.left.sum + c.right.sum;
|
|
}
|
|
|
|
private void pushDown(Node p, int ln, int rn) {
|
|
if (p.left == null) {
|
|
p.left = new Node();
|
|
}
|
|
if (p.right == null) {
|
|
p.right = new Node();
|
|
}
|
|
if (p.update) {
|
|
p.left.update = true;
|
|
p.right.update = true;
|
|
p.left.change = p.change;
|
|
p.right.change = p.change;
|
|
p.left.sum = p.change * ln;
|
|
p.right.sum = p.change * rn;
|
|
p.update = false;
|
|
}
|
|
}
|
|
|
|
public void update(int s, int e, int v) {
|
|
update(root, 1, size, s, e, v);
|
|
}
|
|
|
|
private void update(Node c, int l, int r, int s, int e, int v) {
|
|
if (s <= l && r <= e) {
|
|
c.update = true;
|
|
c.change = v;
|
|
c.sum = v * (r - l + 1);
|
|
} else {
|
|
int mid = (l + r) >> 1;
|
|
pushDown(c, mid - l + 1, r - mid);
|
|
if (s <= mid) {
|
|
update(c.left, l, mid, s, e, v);
|
|
}
|
|
if (e > mid) {
|
|
update(c.right, mid + 1, r, s, e, v);
|
|
}
|
|
pushUp(c);
|
|
}
|
|
}
|
|
|
|
public int query(int s, int e) {
|
|
return query(root, 1, size, s, e);
|
|
}
|
|
|
|
private int query(Node c, int l, int r, int s, int e) {
|
|
if (s <= l && r <= e) {
|
|
return c.sum;
|
|
}
|
|
int mid = (l + r) >> 1;
|
|
pushDown(c, mid - l + 1, r - mid);
|
|
int ans = 0;
|
|
if (s <= mid) {
|
|
ans += query(c.left, l, mid, s, e);
|
|
}
|
|
if (e > mid) {
|
|
ans += query(c.right, mid + 1, r, s, e);
|
|
}
|
|
return ans;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|