Skip to content

Commit 6fa740b

Browse files
committed
feat: add solutions to lc problems: No.2569~2571
* No.2569.Handling Sum Queries After Update * No.2570.Merge Two 2D Arrays by Summing Values * No.2571.Minimum Operations to Reduce an Integer to 0
1 parent 848381c commit 6fa740b

File tree

18 files changed

+1559
-20
lines changed

18 files changed

+1559
-20
lines changed

solution/2500-2599/2569.Handling Sum Queries After Update/README.md

Lines changed: 386 additions & 4 deletions
Large diffs are not rendered by default.

solution/2500-2599/2569.Handling Sum Queries After Update/README_EN.md

Lines changed: 382 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
class Node {
2+
public:
3+
int l = 0, r = 0;
4+
int s = 0, lazy = 0;
5+
};
6+
7+
class SegmentTree {
8+
public:
9+
SegmentTree(vector<int>& nums) {
10+
this->nums = nums;
11+
int n = nums.size();
12+
tr.resize(n << 2);
13+
for (int i = 0; i < tr.size(); ++i) {
14+
tr[i] = new Node();
15+
}
16+
build(1, 1, n);
17+
}
18+
19+
void modify(int u, int l, int r) {
20+
if (tr[u]->l >= l && tr[u]->r <= r) {
21+
tr[u]->lazy ^= 1;
22+
tr[u]->s = tr[u]->r - tr[u]->l + 1 - tr[u]->s;
23+
return;
24+
}
25+
pushdown(u);
26+
int mid = (tr[u]->l + tr[u]->r) >> 1;
27+
if (l <= mid) {
28+
modify(u << 1, l, r);
29+
}
30+
if (r > mid) {
31+
modify(u << 1 | 1, l, r);
32+
}
33+
pushup(u);
34+
}
35+
36+
int query(int u, int l, int r) {
37+
if (tr[u]->l >= l && tr[u]->r <= r) {
38+
return tr[u]->s;
39+
}
40+
pushdown(u);
41+
int mid = (tr[u]->l + tr[u]->r) >> 1;
42+
int res = 0;
43+
if (l <= mid) {
44+
res += query(u << 1, l, r);
45+
}
46+
if (r > mid) {
47+
res += query(u << 1 | 1, l, r);
48+
}
49+
return res;
50+
}
51+
52+
private:
53+
vector<Node*> tr;
54+
vector<int> nums;
55+
56+
void build(int u, int l, int r) {
57+
tr[u]->l = l;
58+
tr[u]->r = r;
59+
if (l == r) {
60+
tr[u]->s = nums[l - 1];
61+
return;
62+
}
63+
int mid = (l + r) >> 1;
64+
build(u << 1, l, mid);
65+
build(u << 1 | 1, mid + 1, r);
66+
pushup(u);
67+
}
68+
69+
void pushup(int u) {
70+
tr[u]->s = tr[u << 1]->s + tr[u << 1 | 1]->s;
71+
}
72+
73+
void pushdown(int u) {
74+
if (tr[u]->lazy) {
75+
int mid = (tr[u]->l + tr[u]->r) >> 1;
76+
tr[u << 1]->s = mid - tr[u]->l + 1 - tr[u << 1]->s;
77+
tr[u << 1]->lazy ^= 1;
78+
tr[u << 1 | 1]->s = tr[u]->r - mid - tr[u << 1 | 1]->s;
79+
tr[u << 1 | 1]->lazy ^= 1;
80+
tr[u]->lazy ^= 1;
81+
}
82+
}
83+
};
84+
85+
class Solution {
86+
public:
87+
vector<long long> handleQuery(vector<int>& nums1, vector<int>& nums2, vector<vector<int>>& queries) {
88+
SegmentTree* tree = new SegmentTree(nums1);
89+
long long s = 0;
90+
for (int& x : nums2) {
91+
s += x;
92+
}
93+
vector<long long> ans;
94+
for (auto& q : queries) {
95+
if (q[0] == 1) {
96+
tree->modify(1, q[1] + 1, q[2] + 1);
97+
} else if (q[0] == 2) {
98+
s += 1LL * q[1] * tree->query(1, 1, nums1.size());
99+
} else {
100+
ans.push_back(s);
101+
}
102+
}
103+
return ans;
104+
}
105+
};
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
type node struct {
2+
l, r, s, lazy int
3+
}
4+
5+
type segmentTree struct {
6+
nums []int
7+
tr []*node
8+
}
9+
10+
func newSegmentTree(nums []int) *segmentTree {
11+
n := len(nums)
12+
tr := make([]*node, n<<2)
13+
for i := range tr {
14+
tr[i] = &node{}
15+
}
16+
t := &segmentTree{nums, tr}
17+
t.build(1, 1, n)
18+
return t
19+
}
20+
21+
func (t *segmentTree) build(u, l, r int) {
22+
t.tr[u].l, t.tr[u].r = l, r
23+
if l == r {
24+
t.tr[u].s = t.nums[l-1]
25+
return
26+
}
27+
mid := (l + r) >> 1
28+
t.build(u<<1, l, mid)
29+
t.build(u<<1|1, mid+1, r)
30+
t.pushup(u)
31+
}
32+
33+
func (t *segmentTree) modify(u, l, r int) {
34+
if t.tr[u].l >= l && t.tr[u].r <= r {
35+
t.tr[u].lazy ^= 1
36+
t.tr[u].s = t.tr[u].r - t.tr[u].l + 1 - t.tr[u].s
37+
return
38+
}
39+
t.pushdown(u)
40+
mid := (t.tr[u].l + t.tr[u].r) >> 1
41+
if l <= mid {
42+
t.modify(u<<1, l, r)
43+
}
44+
if r > mid {
45+
t.modify(u<<1|1, l, r)
46+
}
47+
t.pushup(u)
48+
}
49+
50+
func (t *segmentTree) query(u, l, r int) int {
51+
if t.tr[u].l >= l && t.tr[u].r <= r {
52+
return t.tr[u].s
53+
}
54+
t.pushdown(u)
55+
mid := (t.tr[u].l + t.tr[u].r) >> 1
56+
res := 0
57+
if l <= mid {
58+
res += t.query(u<<1, l, r)
59+
}
60+
if r > mid {
61+
res += t.query(u<<1|1, l, r)
62+
}
63+
return res
64+
}
65+
66+
func (t *segmentTree) pushup(u int) {
67+
t.tr[u].s = t.tr[u<<1].s + t.tr[u<<1|1].s
68+
}
69+
70+
func (t *segmentTree) pushdown(u int) {
71+
if t.tr[u].lazy == 1 {
72+
mid := (t.tr[u].l + t.tr[u].r) >> 1
73+
t.tr[u<<1].s = mid - t.tr[u].l + 1 - t.tr[u<<1].s
74+
t.tr[u<<1].lazy ^= 1
75+
t.tr[u<<1|1].s = t.tr[u].r - mid - t.tr[u<<1|1].s
76+
t.tr[u<<1|1].lazy ^= 1
77+
t.tr[u].lazy ^= 1
78+
}
79+
}
80+
81+
func handleQuery(nums1 []int, nums2 []int, queries [][]int) (ans []int64) {
82+
tree := newSegmentTree(nums1)
83+
var s int64
84+
for _, x := range nums2 {
85+
s += int64(x)
86+
}
87+
for _, q := range queries {
88+
if q[0] == 1 {
89+
tree.modify(1, q[1]+1, q[2]+1)
90+
} else if q[0] == 2 {
91+
s += int64(q[1] * tree.query(1, 1, len(nums1)))
92+
} else {
93+
ans = append(ans, s)
94+
}
95+
}
96+
return
97+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
class Node {
2+
int l, r;
3+
int s, lazy;
4+
}
5+
6+
class SegmentTree {
7+
private Node[] tr;
8+
private int[] nums;
9+
10+
public SegmentTree(int[] nums) {
11+
int n = nums.length;
12+
this.nums = nums;
13+
tr = new Node[n << 2];
14+
for (int i = 0; i < tr.length; ++i) {
15+
tr[i] = new Node();
16+
}
17+
build(1, 1, n);
18+
}
19+
20+
private void build(int u, int l, int r) {
21+
tr[u].l = l;
22+
tr[u].r = r;
23+
if (l == r) {
24+
tr[u].s = nums[l - 1];
25+
return;
26+
}
27+
int mid = (l + r) >> 1;
28+
build(u << 1, l, mid);
29+
build(u << 1 | 1, mid + 1, r);
30+
pushup(u);
31+
}
32+
33+
public void modify(int u, int l, int r) {
34+
if (tr[u].l >= l && tr[u].r <= r) {
35+
tr[u].lazy ^= 1;
36+
tr[u].s = tr[u].r - tr[u].l + 1 - tr[u].s;
37+
return;
38+
}
39+
pushdown(u);
40+
int mid = (tr[u].l + tr[u].r) >> 1;
41+
if (l <= mid) {
42+
modify(u << 1, l, r);
43+
}
44+
if (r > mid) {
45+
modify(u << 1 | 1, l, r);
46+
}
47+
pushup(u);
48+
}
49+
50+
public int query(int u, int l, int r) {
51+
if (tr[u].l >= l && tr[u].r <= r) {
52+
return tr[u].s;
53+
}
54+
pushdown(u);
55+
int mid = (tr[u].l + tr[u].r) >> 1;
56+
int res = 0;
57+
if (l <= mid) {
58+
res += query(u << 1, l, r);
59+
}
60+
if (r > mid) {
61+
res += query(u << 1 | 1, l, r);
62+
}
63+
return res;
64+
}
65+
66+
private void pushup(int u) {
67+
tr[u].s = tr[u << 1].s + tr[u << 1 | 1].s;
68+
}
69+
70+
private void pushdown(int u) {
71+
if (tr[u].lazy == 1) {
72+
int mid = (tr[u].l + tr[u].r) >> 1;
73+
tr[u << 1].s = mid - tr[u].l + 1 - tr[u << 1].s;
74+
tr[u << 1].lazy ^= 1;
75+
tr[u << 1 | 1].s = tr[u].r - mid - tr[u << 1 | 1].s;
76+
tr[u << 1 | 1].lazy ^= 1;
77+
tr[u].lazy ^= 1;
78+
}
79+
}
80+
}
81+
82+
class Solution {
83+
public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) {
84+
SegmentTree tree = new SegmentTree(nums1);
85+
long s = 0;
86+
for (int x : nums2) {
87+
s += x;
88+
}
89+
int m = 0;
90+
for (var q : queries) {
91+
if (q[0] == 3) {
92+
++m;
93+
}
94+
}
95+
long[] ans = new long[m];
96+
int i = 0;
97+
for (var q : queries) {
98+
if (q[0] == 1) {
99+
tree.modify(1, q[1] + 1, q[2] + 1);
100+
} else if (q[0] == 2) {
101+
s += 1L * q[1] * tree.query(1, 1, nums2.length);
102+
} else {
103+
ans[i++] = s;
104+
}
105+
}
106+
return ans;
107+
}
108+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class Node:
2+
def __init__(self):
3+
self.l = self.r = 0
4+
self.s = self.lazy = 0
5+
6+
7+
class SegmentTree:
8+
def __init__(self, nums):
9+
self.nums = nums
10+
n = len(nums)
11+
self.tr = [Node() for _ in range(n << 2)]
12+
self.build(1, 1, n)
13+
14+
def build(self, u, l, r):
15+
self.tr[u].l, self.tr[u].r = l, r
16+
if l == r:
17+
self.tr[u].s = self.nums[l - 1]
18+
return
19+
mid = (l + r) >> 1
20+
self.build(u << 1, l, mid)
21+
self.build(u << 1 | 1, mid + 1, r)
22+
self.pushup(u)
23+
24+
def modify(self, u, l, r):
25+
if self.tr[u].l >= l and self.tr[u].r <= r:
26+
self.tr[u].lazy ^= 1
27+
self.tr[u].s = self.tr[u].r - self.tr[u].l + 1 - self.tr[u].s
28+
return
29+
self.pushdown(u)
30+
mid = (self.tr[u].l + self.tr[u].r) >> 1
31+
if l <= mid:
32+
self.modify(u << 1, l, r)
33+
if r > mid:
34+
self.modify(u << 1 | 1, l, r)
35+
self.pushup(u)
36+
37+
def query(self, u, l, r):
38+
if self.tr[u].l >= l and self.tr[u].r <= r:
39+
return self.tr[u].s
40+
self.pushdown(u)
41+
mid = (self.tr[u].l + self.tr[u].r) >> 1
42+
res = 0
43+
if l <= mid:
44+
res += self.query(u << 1, l, r)
45+
if r > mid:
46+
res += self.query(u << 1 | 1, l, r)
47+
return res
48+
49+
def pushup(self, u):
50+
self.tr[u].s = self.tr[u << 1].s + self.tr[u << 1 | 1].s
51+
52+
def pushdown(self, u):
53+
if self.tr[u].lazy:
54+
mid = (self.tr[u].l + self.tr[u].r) >> 1
55+
self.tr[u << 1].s = mid - self.tr[u].l + 1 - self.tr[u << 1].s
56+
self.tr[u << 1].lazy ^= 1
57+
self.tr[u << 1 | 1].s = self.tr[u].r - mid - self.tr[u << 1 | 1].s
58+
self.tr[u << 1 | 1].lazy ^= 1
59+
self.tr[u].lazy ^= 1
60+
61+
62+
class Solution:
63+
def handleQuery(
64+
self, nums1: List[int], nums2: List[int], queries: List[List[int]]
65+
) -> List[int]:
66+
tree = SegmentTree(nums1)
67+
s = sum(nums2)
68+
ans = []
69+
for op, a, b in queries:
70+
if op == 1:
71+
tree.modify(1, a + 1, b + 1)
72+
elif op == 2:
73+
s += a * tree.query(1, 1, len(nums1))
74+
else:
75+
ans.append(s)
76+
return ans

0 commit comments

Comments
 (0)