1
1
package g2901_3000.s2902_count_of_sub_multisets_with_bounded_sum
2
2
3
3
// #Hard #Array #Hash_Table #Dynamic_Programming #Sliding_Window
4
- // #2023_12_31_Time_249_ms_(100.00 %)_Space_41.2_MB_(100.00 %)
4
+ // #2024_01_03_Time_263_ms_(87.50 %)_Space_41.5_MB_(37.50 %)
5
5
6
6
import kotlin.math.min
7
7
8
8
@Suppress(" NAME_SHADOWING" )
9
9
class Solution {
10
+ private val mod = 1000000007
11
+ private val intMap = IntMap ()
12
+
10
13
fun countSubMultisets (nums : List <Int >, l : Int , r : Int ): Int {
11
- var r = r
12
- INT_MAP .clear()
13
- INT_MAP .add(0 )
14
+ intMap.clear()
15
+ intMap.add(0 )
14
16
var total = 0
15
17
for (num in nums) {
16
- INT_MAP .add(num)
18
+ intMap .add(num)
17
19
total + = num
18
20
}
19
21
if (total < l) {
20
22
return 0
21
23
}
22
- r = min(r, total)
24
+ val r = min(r, total)
23
25
val cnt = IntArray (r + 1 )
24
- cnt[0 ] = INT_MAP .map[0 ]
26
+ cnt[0 ] = intMap .map[0 ]
25
27
var sum = 0
26
- for (i in 1 until INT_MAP .size) {
27
- val ` val ` = INT_MAP .vals[i]
28
- val count = INT_MAP .map[` val ` ]
28
+ for (i in 1 until intMap .size) {
29
+ val value = intMap .vals[i]
30
+ val count = intMap .map[value ]
29
31
if (count > 0 ) {
30
- sum = min(r, sum + ` val ` * count)
31
- update(cnt, ` val ` , count, sum)
32
+ sum = min(r, sum + value * count)
33
+ update(cnt, value , count, sum)
32
34
}
33
35
}
34
36
var res = 0
35
37
for (i in l.. r) {
36
- res = (res + cnt[i]) % MOD
38
+ res = (res + cnt[i]) % mod
37
39
}
38
40
return res
39
41
}
40
42
41
43
private fun update (cnt : IntArray , n : Int , count : Int , sum : Int ) {
42
44
if (count == 1 ) {
43
45
for (i in sum downTo n) {
44
- cnt[i] = (cnt[i] + cnt[i - n]) % MOD
46
+ cnt[i] = (cnt[i] + cnt[i - n]) % mod
45
47
}
46
48
} else {
47
49
for (i in n.. sum) {
48
- cnt[i] = (cnt[i] + cnt[i - n]) % MOD
50
+ cnt[i] = (cnt[i] + cnt[i - n]) % mod
49
51
}
50
52
val max = (count + 1 ) * n
51
53
for (i in sum downTo max) {
52
- cnt[i] = (cnt[i] - cnt[i - max] + MOD ) % MOD
54
+ cnt[i] = (cnt[i] - cnt[i - max] + mod ) % mod
53
55
}
54
56
}
55
57
}
56
58
57
59
private class IntMap {
58
- val map: IntArray = IntArray (MAX )
59
- val vals: IntArray = IntArray (MAX )
60
- var size: Int = 0
60
+ private val max = 20001
61
+ val map = IntArray (max)
62
+ val vals = IntArray (max)
63
+ var size = 0
61
64
62
65
fun add (v : Int ) {
63
66
if (map[v]++ == 0 ) {
@@ -72,10 +75,4 @@ class Solution {
72
75
size = 0
73
76
}
74
77
}
75
-
76
- companion object {
77
- private const val MOD = 1000000007
78
- private const val MAX = 20001
79
- private val INT_MAP = IntMap ()
80
- }
81
78
}
0 commit comments