@@ -82,32 +82,237 @@ tags:
82
82
83
83
<!-- solution:start -->
84
84
85
- ### 方法一
85
+ ### 方法一:枚举 + 维护最小与次小值
86
+
87
+ 我们把所有冲突对 $(a, b)$(假设 $a \lt b$)存入一个列表 $g$ 中,其中 $g[ a] $ 表示所有与 $a$ 冲突的数 $b$ 的集合。
88
+
89
+ 假设没有删除,那么我们可以倒序枚举每个子数组的左端点 $a$,那么其右端点的上界就是所有 $g[ x \geq a] $ 中的最小值 $b_1$(不包括 $b_1$),对答案的贡献就是 $b_1 - a$。
90
+
91
+ 如果我们删除了一个包含 $b_1$ 的冲突对,那么此时新的 $b_1$ 就是所有 $g[ x \geq a] $ 中的次小值 $b_2$,其对答案新增的贡献为 $b_2 - b_1$。我们用一个数组 $\text{cnt}$ 来记录每个 $b_1$ 的新增贡献。
92
+
93
+ 最终答案就是所有 $b_1 - a$ 的贡献加上 $\text{cnt}[ b_1] $ 的最大值。
94
+
95
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是冲突对的数量。
86
96
87
97
<!-- tabs:start -->
88
98
89
99
#### Python3
90
100
91
101
``` python
92
-
102
+ class Solution :
103
+ def maxSubarrays (self , n : int , conflictingPairs : List[List[int ]]) -> int :
104
+ g = [[] for _ in range (n + 1 )]
105
+ for a, b in conflictingPairs:
106
+ if a > b:
107
+ a, b = b, a
108
+ g[a].append(b)
109
+ cnt = [0 ] * (n + 2 )
110
+ ans = add = 0
111
+ b1 = b2 = n + 1
112
+ for a in range (n, 0 , - 1 ):
113
+ for b in g[a]:
114
+ if b < b1:
115
+ b2, b1 = b1, b
116
+ elif b < b2:
117
+ b2 = b
118
+ ans += b1 - a
119
+ cnt[b1] += b2 - b1
120
+ add = max (add, cnt[b1])
121
+ ans += add
122
+ return ans
93
123
```
94
124
95
125
#### Java
96
126
97
127
``` java
98
-
128
+ class Solution {
129
+ public long maxSubarrays (int n , int [][] conflictingPairs ) {
130
+ List<Integer > [] g = new List [n + 1 ];
131
+ Arrays . setAll(g, k - > new ArrayList<> ());
132
+ for (int [] pair : conflictingPairs) {
133
+ int a = pair[0 ], b = pair[1 ];
134
+ if (a > b) {
135
+ int c = a;
136
+ a = b;
137
+ b = c;
138
+ }
139
+ g[a]. add(b);
140
+ }
141
+ long [] cnt = new long [n + 2 ];
142
+ long ans = 0 , add = 0 ;
143
+ int b1 = n + 1 , b2 = n + 1 ;
144
+ for (int a = n; a > 0 ; -- a) {
145
+ for (int b : g[a]) {
146
+ if (b < b1) {
147
+ b2 = b1;
148
+ b1 = b;
149
+ } else if (b < b2) {
150
+ b2 = b;
151
+ }
152
+ }
153
+ ans += b1 - a;
154
+ cnt[b1] += b2 - b1;
155
+ add = Math . max(add, cnt[b1]);
156
+ }
157
+ ans += add;
158
+ return ans;
159
+ }
160
+ }
99
161
```
100
162
101
163
#### C++
102
164
103
165
``` cpp
104
-
166
+ class Solution {
167
+ public:
168
+ long long maxSubarrays(int n, vector<vector<int >>& conflictingPairs) {
169
+ vector<vector<int >> g(n + 1);
170
+ for (auto& pair : conflictingPairs) {
171
+ int a = pair[ 0] , b = pair[ 1] ;
172
+ if (a > b) {
173
+ swap(a, b);
174
+ }
175
+ g[ a] .push_back(b);
176
+ }
177
+
178
+ vector<long long> cnt(n + 2, 0);
179
+ long long ans = 0, add = 0;
180
+ int b1 = n + 1, b2 = n + 1;
181
+
182
+ for (int a = n; a > 0; --a) {
183
+ for (int b : g[a]) {
184
+ if (b < b1) {
185
+ b2 = b1;
186
+ b1 = b;
187
+ } else if (b < b2) {
188
+ b2 = b;
189
+ }
190
+ }
191
+ ans += b1 - a;
192
+ cnt[b1] += b2 - b1;
193
+ add = max(add, cnt[b1]);
194
+ }
195
+
196
+ ans += add;
197
+ return ans;
198
+ }
199
+ };
105
200
```
106
201
107
202
#### Go
108
203
109
204
``` go
205
+ func maxSubarrays (n int , conflictingPairs [][]int ) (ans int64 ) {
206
+ g := make ([][]int , n+1 )
207
+ for _ , pair := range conflictingPairs {
208
+ a , b := pair[0 ], pair[1 ]
209
+ if a > b {
210
+ a, b = b, a
211
+ }
212
+ g[a] = append (g[a], b)
213
+ }
214
+
215
+ cnt := make ([]int64 , n+2 )
216
+ var add int64
217
+ b1 , b2 := n+1 , n+1
218
+
219
+ for a := n; a > 0 ; a-- {
220
+ for _ , b := range g[a] {
221
+ if b < b1 {
222
+ b2 = b1
223
+ b1 = b
224
+ } else if b < b2 {
225
+ b2 = b
226
+ }
227
+ }
228
+ ans += int64 (b1 - a)
229
+ cnt[b1] += int64 (b2 - b1)
230
+ if cnt[b1] > add {
231
+ add = cnt[b1]
232
+ }
233
+ }
234
+
235
+ ans += add
236
+ return ans
237
+ }
238
+ ```
239
+
240
+ #### TypeScript
241
+
242
+ ``` ts
243
+ function maxSubarrays(n : number , conflictingPairs : number [][]): number {
244
+ const g: number [][] = Array .from ({ length: n + 1 }, () => []);
245
+ for (let [a, b] of conflictingPairs ) {
246
+ if (a > b ) {
247
+ [a , b ] = [b , a ];
248
+ }
249
+ g [a ].push (b );
250
+ }
251
+
252
+ const cnt: number [] = Array (n + 2 ).fill (0 );
253
+ let ans = 0 ,
254
+ add = 0 ;
255
+ let b1 = n + 1 ,
256
+ b2 = n + 1 ;
257
+
258
+ for (let a = n ; a > 0 ; a -- ) {
259
+ for (const b of g [a ]) {
260
+ if (b < b1 ) {
261
+ b2 = b1 ;
262
+ b1 = b ;
263
+ } else if (b < b2 ) {
264
+ b2 = b ;
265
+ }
266
+ }
267
+ ans += b1 - a ;
268
+ cnt [b1 ] += b2 - b1 ;
269
+ add = Math .max (add , cnt [b1 ]);
270
+ }
271
+
272
+ ans += add ;
273
+ return ans ;
274
+ }
275
+ ```
110
276
277
+ #### Rust
278
+
279
+ ``` rust
280
+ impl Solution {
281
+ pub fn max_subarrays (n : i32 , conflicting_pairs : Vec <Vec <i32 >>) -> i64 {
282
+ let mut g : Vec <Vec <i32 >> = vec! [vec! []; (n + 1 ) as usize ];
283
+ for pair in conflicting_pairs {
284
+ let mut a = pair [0 ];
285
+ let mut b = pair [1 ];
286
+ if a > b {
287
+ std :: mem :: swap (& mut a , & mut b );
288
+ }
289
+ g [a as usize ]. push (b );
290
+ }
291
+
292
+ let mut cnt : Vec <i64 > = vec! [0 ; (n + 2 ) as usize ];
293
+ let mut ans = 0i64 ;
294
+ let mut add = 0i64 ;
295
+ let mut b1 = n + 1 ;
296
+ let mut b2 = n + 1 ;
297
+
298
+ for a in (1 ..= n ). rev () {
299
+ for & b in & g [a as usize ] {
300
+ if b < b1 {
301
+ b2 = b1 ;
302
+ b1 = b ;
303
+ } else if b < b2 {
304
+ b2 = b ;
305
+ }
306
+ }
307
+ ans += (b1 - a ) as i64 ;
308
+ cnt [b1 as usize ] += (b2 - b1 ) as i64 ;
309
+ add = std :: cmp :: max (add , cnt [b1 as usize ]);
310
+ }
311
+
312
+ ans += add ;
313
+ ans
314
+ }
315
+ }
111
316
```
112
317
113
318
<!-- tabs:end -->
0 commit comments