@@ -99,46 +99,84 @@ countIntervals.count(); // 返回 8
9999
100100``` python
101101class 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
128166class 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