-
Notifications
You must be signed in to change notification settings - Fork 481
/
Copy path1395.go
38 lines (32 loc) · 837 Bytes
/
1395.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var N int
func numTeams(rating []int) int {
N = 100000
leftTree := make([]int, N + 1)
rightTree := make([]int, N + 1)
for _, r := range rating {
update(rightTree, r, 1)
}
res := 0
for _, r := range rating {
update(rightTree, r, -1)
res += getPrefixSum(leftTree, r - 1) * getSuffixSum(rightTree, r + 1) +
getSuffixSum(leftTree, r + 1) * getPrefixSum(rightTree, r - 1)
update(leftTree, r, 1)
}
return res
}
func update(tr []int, x, v int) {
for i := x; i <= N; i += i & -i {
tr[i] += v
}
}
func getPrefixSum(tr []int, x int) int {
res := 0
for i := x; i > 0; i -= i & -i {
res += tr[i]
}
return res
}
func getSuffixSum(tr []int, i int) int {
return getPrefixSum(tr, N) - getPrefixSum(tr, i - 1)
}