@@ -62,6 +62,10 @@ countIntervals.count(); // 返回 8
62
62
63
63
<!-- 这里可写通用的实现逻辑 -->
64
64
65
+ ** 方法一:线段树**
66
+
67
+ 区间求和问题,且值域较大,采用动态开点线段树。
68
+
65
69
<!-- tabs:start -->
66
70
67
71
### ** Python3**
@@ -77,6 +81,118 @@ countIntervals.count(); // 返回 8
77
81
<!-- 这里可写当前语言的特殊实现逻辑 -->
78
82
79
83
``` java
84
+ class Node {
85
+ Node left;
86
+ Node right;
87
+ int l;
88
+ int r;
89
+ int mid;
90
+ int v;
91
+ int add;
92
+
93
+ public Node (int l , int r ) {
94
+ this . l = l;
95
+ this . r = r;
96
+ this . mid = (l + r) >> 1 ;
97
+ }
98
+ }
99
+
100
+ class SegmentTree {
101
+ private Node root = new Node (1 , (int ) 1e9 + 1 );
102
+
103
+ public SegmentTree () {
104
+
105
+ }
106
+
107
+ public void modify (int l , int r , int v ) {
108
+ modify(l, r, v, root);
109
+ }
110
+
111
+ public void modify (int l , int r , int v , Node node ) {
112
+ if (l > r) {
113
+ return ;
114
+ }
115
+ if (node. l >= l && node. r <= r) {
116
+ node. v = node. r - node. l + 1 ;
117
+ node. add = v;
118
+ return ;
119
+ }
120
+ pushdown(node);
121
+ if (l <= node. mid) {
122
+ modify(l, r, v, node. left);
123
+ }
124
+ if (r > node. mid) {
125
+ modify(l, r, v, node. right);
126
+ }
127
+ pushup(node);
128
+ }
129
+
130
+ public int query (int l , int r ) {
131
+ return query(l, r, root);
132
+ }
133
+
134
+ public int query (int l , int r , Node node ) {
135
+ if (l > r) {
136
+ return 0 ;
137
+ }
138
+ if (node. l >= l && node. r <= r) {
139
+ return node. v;
140
+ }
141
+ pushdown(node);
142
+ int v = 0 ;
143
+ if (l <= node. mid) {
144
+ v += query(l, r, node. left);
145
+ }
146
+ if (r > node. mid) {
147
+ v += query(l, r, node. right);
148
+ }
149
+ return v;
150
+ }
151
+
152
+ public void pushup (Node node ) {
153
+ node. v = node. left. v + node. right. v;
154
+ }
155
+
156
+ public void pushdown (Node node ) {
157
+ if (node. left == null ) {
158
+ node. left = new Node (node. l, node. mid);
159
+ }
160
+ if (node. right == null ) {
161
+ node. right = new Node (node. mid + 1 , node. r);
162
+ }
163
+ if (node. add != 0 ) {
164
+ Node left = node. left, right = node. right;
165
+ left. add = node. add;
166
+ right. add = node. add;
167
+ left. v = left. r - left. l + 1 ;
168
+ right. v = right. r - right. l + 1 ;
169
+ node. add = 0 ;
170
+ }
171
+ }
172
+ }
173
+
174
+ class CountIntervals {
175
+ private SegmentTree tree = new SegmentTree ();
176
+
177
+ public CountIntervals () {
178
+
179
+ }
180
+
181
+ public void add (int left , int right ) {
182
+ tree. modify(left, right, 1 );
183
+ }
184
+
185
+ public int count () {
186
+ return tree. query(1 , (int ) 1e9 );
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Your CountIntervals object will be instantiated and called as such:
192
+ * CountIntervals obj = new CountIntervals();
193
+ * obj.add(left,right);
194
+ * int param_2 = obj.count();
195
+ */
80
196
81
197
```
82
198
0 commit comments