Skip to content

Commit fc4feaf

Browse files
authored
feat: update lc problems (#4119)
1 parent f5fab82 commit fc4feaf

File tree

20 files changed

+334
-379
lines changed

20 files changed

+334
-379
lines changed

solution/2200-2299/2276.Count Integers in Intervals/README.md

+63-120
Original file line numberDiff line numberDiff line change
@@ -99,46 +99,84 @@ countIntervals.count(); // 返回 8
9999

100100
```python
101101
class Node:
102-
def __init__(self):
103-
self.tag = 0
104-
self.tot = 0
102+
__slots__ = ("left", "right", "l", "r", "mid", "v", "add")
103+
104+
def __init__(self, l, r):
105105
self.left = None
106106
self.right = None
107+
self.l = l
108+
self.r = r
109+
self.mid = (l + r) // 2
110+
self.v = 0
111+
self.add = 0
112+
107113

108-
def update(self, l, r, a, b):
109-
if self.tag == 1:
114+
class SegmentTree:
115+
def __init__(self):
116+
self.root = Node(1, int(1e9) + 1)
117+
118+
def modify(self, l, r, v, node=None):
119+
if node is None:
120+
node = self.root
121+
if l > r:
110122
return
111-
mid = (a + b) >> 1
112-
if l == a and r == b:
113-
self.tag = 1
114-
self.tot = b - a + 1
123+
if node.l >= l and node.r <= r:
124+
node.v = node.r - node.l + 1
125+
node.add = v
115126
return
116-
if not self.left:
117-
self.left = Node()
118-
if not self.right:
119-
self.right = Node()
120-
if mid >= l:
121-
self.left.update(l, min(mid, r), a, mid)
122-
if mid + 1 <= r:
123-
self.right.update(max(mid + 1, l), r, mid + 1, b)
124-
self.tag = 0
125-
self.tot = self.left.tot + self.right.tot
127+
self.pushdown(node)
128+
if l <= node.mid:
129+
self.modify(l, r, v, node.left)
130+
if r > node.mid:
131+
self.modify(l, r, v, node.right)
132+
self.pushup(node)
133+
134+
def query(self, l, r, node=None):
135+
if node is None:
136+
node = self.root
137+
if l > r:
138+
return 0
139+
if node.l >= l and node.r <= r:
140+
return node.v
141+
self.pushdown(node)
142+
v = 0
143+
if l <= node.mid:
144+
v += self.query(l, r, node.left)
145+
if r > node.mid:
146+
v += self.query(l, r, node.right)
147+
return v
148+
149+
def pushup(self, node):
150+
node.v = node.left.v + node.right.v
151+
152+
def pushdown(self, node):
153+
if node.left is None:
154+
node.left = Node(node.l, node.mid)
155+
if node.right is None:
156+
node.right = Node(node.mid + 1, node.r)
157+
if node.add != 0:
158+
left, right = node.left, node.right
159+
left.add = node.add
160+
right.add = node.add
161+
left.v = left.r - left.l + 1
162+
right.v = right.r - right.l + 1
163+
node.add = 0
126164

127165

128166
class CountIntervals:
129167
def __init__(self):
130-
self.tree = Node()
168+
self.tree = SegmentTree()
131169

132-
def add(self, left: int, right: int) -> None:
133-
self.tree.update(left, right, 0, 1000000010)
170+
def add(self, left, right):
171+
self.tree.modify(left, right, 1)
134172

135-
def count(self) -> int:
136-
return self.tree.tot
173+
def count(self):
174+
return self.tree.query(1, int(1e9))
137175

138176

139177
# Your CountIntervals object will be instantiated and called as such:
140178
# obj = CountIntervals()
141-
# obj.add(left,right)
179+
# obj.add(left, right)
142180
# param_2 = obj.count()
143181
```
144182

@@ -548,99 +586,4 @@ class CountIntervals {
548586

549587
<!-- solution:end -->
550588

551-
<!-- solution:start -->
552-
553-
### 方法二
554-
555-
<!-- tabs:start -->
556-
557-
#### Python3
558-
559-
```python
560-
class Node:
561-
__slots__ = ("left", "right", "l", "r", "mid", "v", "add")
562-
563-
def __init__(self, l, r):
564-
self.left = None
565-
self.right = None
566-
self.l = l
567-
self.r = r
568-
self.mid = (l + r) // 2
569-
self.v = 0
570-
self.add = 0
571-
572-
573-
class SegmentTree:
574-
def __init__(self):
575-
self.root = Node(1, int(1e9) + 1)
576-
577-
def modify(self, l, r, v, node=None):
578-
if node is None:
579-
node = self.root
580-
if l > r:
581-
return
582-
if node.l >= l and node.r <= r:
583-
node.v = node.r - node.l + 1
584-
node.add = v
585-
return
586-
self.pushdown(node)
587-
if l <= node.mid:
588-
self.modify(l, r, v, node.left)
589-
if r > node.mid:
590-
self.modify(l, r, v, node.right)
591-
self.pushup(node)
592-
593-
def query(self, l, r, node=None):
594-
if node is None:
595-
node = self.root
596-
if l > r:
597-
return 0
598-
if node.l >= l and node.r <= r:
599-
return node.v
600-
self.pushdown(node)
601-
v = 0
602-
if l <= node.mid:
603-
v += self.query(l, r, node.left)
604-
if r > node.mid:
605-
v += self.query(l, r, node.right)
606-
return v
607-
608-
def pushup(self, node):
609-
node.v = node.left.v + node.right.v
610-
611-
def pushdown(self, node):
612-
if node.left is None:
613-
node.left = Node(node.l, node.mid)
614-
if node.right is None:
615-
node.right = Node(node.mid + 1, node.r)
616-
if node.add != 0:
617-
left, right = node.left, node.right
618-
left.add = node.add
619-
right.add = node.add
620-
left.v = left.r - left.l + 1
621-
right.v = right.r - right.l + 1
622-
node.add = 0
623-
624-
625-
class CountIntervals:
626-
def __init__(self):
627-
self.tree = SegmentTree()
628-
629-
def add(self, left, right):
630-
self.tree.modify(left, right, 1)
631-
632-
def count(self):
633-
return self.tree.query(1, int(1e9))
634-
635-
636-
# Your CountIntervals object will be instantiated and called as such:
637-
# obj = CountIntervals()
638-
# obj.add(left, right)
639-
# param_2 = obj.count()
640-
```
641-
642-
<!-- tabs:end -->
643-
644-
<!-- solution:end -->
645-
646589
<!-- problem:end -->

0 commit comments

Comments
 (0)