add new solutions
This commit is contained in:
parent
0c73608ce5
commit
d798d5e8c9
19 changed files with 661 additions and 4 deletions
85
solutions/34/q3454/solution.go
Normal file
85
solutions/34/q3454/solution.go
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
package q3454
|
||||
|
||||
import (
|
||||
"math"
|
||||
"slices"
|
||||
)
|
||||
|
||||
type void struct{}
|
||||
|
||||
func calcLengthAtY(squares [][]int) [][2]int {
|
||||
vertIdx := make([][2]int, len(squares)*2)
|
||||
for i := range squares {
|
||||
vertIdx[i*2] = [2]int{squares[i][1], i}
|
||||
vertIdx[i*2+1] = [2]int{squares[i][1] + squares[i][2], i}
|
||||
}
|
||||
slices.SortFunc(vertIdx, func(a, b [2]int) int { return a[0] - b[0] })
|
||||
|
||||
curSq := map[int]void{}
|
||||
curLenBuf := make([][2]int, len(squares))
|
||||
|
||||
calcLen := func() int {
|
||||
curLen := 0
|
||||
curLenBuf = curLenBuf[:0]
|
||||
for i := range curSq {
|
||||
l := squares[i][0]
|
||||
r := l + squares[i][2]
|
||||
curLenBuf = append(curLenBuf, [2]int{l, r})
|
||||
}
|
||||
slices.SortFunc(curLenBuf, func(a, b [2]int) int { return a[0] - b[0] })
|
||||
r := math.MinInt
|
||||
for i := range curLenBuf {
|
||||
if curLenBuf[i][0] < r {
|
||||
curLen += max(0, curLenBuf[i][1]-r)
|
||||
} else {
|
||||
curLen += curLenBuf[i][1] - curLenBuf[i][0]
|
||||
}
|
||||
r = max(r, curLenBuf[i][1])
|
||||
}
|
||||
return curLen
|
||||
}
|
||||
|
||||
ret := make([][2]int, 0, len(squares)*2)
|
||||
for i := 0; i < len(vertIdx); {
|
||||
curY := vertIdx[i][0]
|
||||
for ; i < len(vertIdx) && vertIdx[i][0] == curY; i++ {
|
||||
sq := vertIdx[i][1]
|
||||
if _, ok := curSq[sq]; ok {
|
||||
delete(curSq, sq)
|
||||
} else {
|
||||
curSq[sq] = void{}
|
||||
}
|
||||
}
|
||||
|
||||
ret = append(ret, [2]int{curY, calcLen()})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func separateSquares(squares [][]int) float64 {
|
||||
lenAtY := calcLengthAtY(squares)
|
||||
|
||||
totalArea := 0
|
||||
for i := 0; i < len(lenAtY)-1; i++ {
|
||||
totalArea += lenAtY[i][1] * (lenAtY[i+1][0] - lenAtY[i][0])
|
||||
}
|
||||
|
||||
var area int
|
||||
for i := 0; i < len(lenAtY)-1; i++ {
|
||||
y, nextY := lenAtY[i][0], lenAtY[i+1][0]
|
||||
l := lenAtY[i][1]
|
||||
|
||||
areaT := (nextY-y)*l + area
|
||||
switch {
|
||||
case areaT*2 == totalArea:
|
||||
return float64(nextY)
|
||||
case areaT*2 > totalArea:
|
||||
needed := float64(totalArea-area*2) / 2
|
||||
return float64(y) + needed/float64(l)
|
||||
}
|
||||
area = areaT
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
var _ = separateSquares
|
||||
Loading…
Add table
Add a link
Reference in a new issue