Skip to content

Commit fc4feaf

Browse files
authored
feat: update lc problems (doocs#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

Lines changed: 63 additions & 120 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy