Skip to content

Commit 591d896

Browse files
authored
Create 3748-count-stable-subarrays.js
1 parent 7ccba55 commit 591d896

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

3748-count-stable-subarrays.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number[][]} queries
4+
* @return {number[]}
5+
*/
6+
var countStableSubarrays = function(nums, queries) {
7+
let n = nums.length
8+
const {floor: flr} = Math
9+
let res = []
10+
let segments = [], start = 0
11+
12+
for(let i = 0; i < n; i++) {
13+
if(nums[i] < nums[i - 1]) {
14+
segments.push([start, i - 1])
15+
start = i
16+
}
17+
}
18+
segments.push([start, n - 1])
19+
20+
let pc = []
21+
22+
let total = 0
23+
for(const [s, e] of segments) {
24+
let length = e - s + 1
25+
let count = length * (length + 1) / 2
26+
total += count
27+
pc.push(total)
28+
}
29+
30+
for(const [l, r] of queries) {
31+
let li = bisect(segments, l) - 1
32+
let ri = bisect(segments, r) - 1
33+
if(li < 0) li = 0
34+
if(ri < 0) ri = 0
35+
if(li === ri) {
36+
let [ss, se] = segments[li]
37+
let length = r - l + 1
38+
let count = length * (length + 1) / 2
39+
res.push(count)
40+
} else {
41+
let [ss, se] = segments[li]
42+
let ll = se - l + 1
43+
let lc = ll * (ll + 1) / 2
44+
45+
let [ssr, ser] = segments[ri]
46+
let rl = r - ssr + 1
47+
let rc = rl * (rl + 1) / 2
48+
49+
let mid_count = 0
50+
if(ri - li > 1) {
51+
mid_count = pc[ri - 1] - pc[li]
52+
}
53+
res.push(lc + mid_count + rc)
54+
}
55+
56+
}
57+
58+
return res
59+
60+
function bisect(segments, x) {
61+
let low = 0, high = segments.length
62+
while(low < high) {
63+
let mid = flr((low + high) / 2)
64+
if(segments[mid][0] <= x) low = mid + 1
65+
else high = mid
66+
}
67+
68+
return low
69+
}
70+
};

0 commit comments

Comments
 (0)