@@ -99,46 +99,84 @@ countIntervals.count(); // 返回 8
99
99
100
100
``` python
101
101
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 ):
105
105
self .left = None
106
106
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
+
107
113
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:
110
122
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
115
126
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
126
164
127
165
128
166
class CountIntervals :
129
167
def __init__ (self ):
130
- self .tree = Node ()
168
+ self .tree = SegmentTree ()
131
169
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 )
134
172
135
- def count (self ) -> int :
136
- return self .tree.tot
173
+ def count (self ):
174
+ return self .tree.query( 1 , int ( 1e9 ))
137
175
138
176
139
177
# Your CountIntervals object will be instantiated and called as such:
140
178
# obj = CountIntervals()
141
- # obj.add(left,right)
179
+ # obj.add(left, right)
142
180
# param_2 = obj.count()
143
181
```
144
182
@@ -548,99 +586,4 @@ class CountIntervals {
548
586
549
587
<!-- solution:end -->
550
588
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
-
646
589
<!-- problem:end -->
0 commit comments