← Home
For problem statement at 0-999/800-899/880-889/887/problemE.txt this is a correct solution, but verifier at 0-999/800-899/880-889/887/verifierE.go ends with case 1 failed: expected 415.24329 got 15.50000
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"io"
	"math"
	"math/bits"
	"os"
	"sort"
)

type U128 struct {
	hi uint64
	lo uint64
}

type Interval struct {
	l float64
	r float64
}

const two64 = 18446744073709551616.0

func mulU(a, b uint64) U128 {
	hi, lo := bits.Mul64(a, b)
	return U128{hi: hi, lo: lo}
}

func cmpU(a, b U128) int {
	if a.hi < b.hi {
		return -1
	}
	if a.hi > b.hi {
		return 1
	}
	if a.lo < b.lo {
		return -1
	}
	if a.lo > b.lo {
		return 1
	}
	return 0
}

func subU(a, b U128) U128 {
	lo, borrow := bits.Sub64(a.lo, b.lo, 0)
	hi, _ := bits.Sub64(a.hi, b.hi, borrow)
	return U128{hi: hi, lo: lo}
}

func shlU(a U128, k uint) U128 {
	if k == 0 {
		return a
	}
	if k < 64 {
		return U128{
			hi: (a.hi << k) | (a.lo >> (64 - k)),
			lo: a.lo << k,
		}
	}
	if k < 128 {
		return U128{
			hi: a.lo << (k - 64),
			lo: 0,
		}
	}
	return U128{}
}

func toFloatU(a U128) float64 {
	return float64(a.hi)*two64 + float64(a.lo)
}

func abs64(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int64 {
		for idx < len(data) {
			c := data[idx]
			if c == ' ' || c == '\n' || c == '\r' || c == '\t' {
				idx++
			} else {
				break
			}
		}
		sign := int64(1)
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		var val int64
		for idx < len(data) {
			c := data[idx]
			if c < '0' || c > '9' {
				break
			}
			val = val*10 + int64(c-'0')
			idx++
		}
		return sign * val
	}

	x1 := nextInt()
	y1 := nextInt()
	x2 := nextInt()
	y2 := nextInt()

	n := int(nextInt())

	dx := x2 - x1
	dy := y2 - y1
	D := dx*dx + dy*dy
	Df := float64(D)
	sqrtD := math.Sqrt(Df)
	a2 := Df / 4.0

	intervals := make([]Interval, 0, n)

	for i := 0; i < n; i++ {
		xi := nextInt()
		yi := nextInt()
		ri := nextInt()

		s := dx*(yi-y1) - dy*(xi-x1)
		sAbs := uint64(abs64(s))
		r2 := uint64(ri) * uint64(ri)

		s2 := mulU(sAbs, sAbs)
		r2D := mulU(r2, uint64(D))
		Nu := subU(s2, r2D)
		Nf := toFloatU(Nu)

		tx := 2*xi - x1 - x2
		ty := 2*yi - y1 - y2
		K4 := tx*tx + ty*ty - D - 4*ri*ri
		K := float64(K4) / 4.0

		kAbs := uint64(abs64(K4))
		K4sq := mulU(kAbs, kAbs)
		sixteenR2D := shlU(r2D, 4)

		var Cf float64
		if cmpU(K4sq, sixteenR2D) >= 0 {
			Cf = toFloatU(subU(K4sq, sixteenR2D)) / 64.0
		} else {
			Cf = -toFloatU(subU(sixteenR2D, K4sq)) / 64.0
		}

		A := Nf / Df
		B := -K * float64(s) / sqrtD
		sqrtDisc := float64(ri) * math.Sqrt(K*K+Nf)

		var q float64
		if B >= 0 {
			q = -0.5 * (B + sqrtDisc)
		} else {
			q = -0.5 * (B - sqrtDisc)
		}

		r1 := q / A
		r2f := Cf / q
		if r1 > r2f {
			r1, r2f = r2f, r1
		}
		intervals = append(intervals, Interval{l: r1, r: r2f})
	}

	sort.Slice(intervals, func(i, j int) bool {
		if intervals[i].l == intervals[j].l {
			return intervals[i].r < intervals[j].r
		}
		return intervals[i].l < intervals[j].l
	})

	bestT := 0.0
	covered := false

	for i := 0; i < len(intervals); {
		L := intervals[i].l
		R := intervals[i].r
		i++
		for i < len(intervals) && intervals[i].l < R {
			if intervals[i].r > R {
				R = intervals[i].r
			}
			i++
		}
		if L < 0 && 0 < R {
			covered = true
			if -L < R {
				bestT = -L
			} else {
				bestT = R
			}
			break
		}
		if L > 0 {
			break
		}
	}

	ans := sqrtD / 2.0
	if covered {
		ans = math.Sqrt(a2 + bestT*bestT)
	}

	out := bufio.NewWriter(os.Stdout)
	fmt.Fprintf(out, "%.15f\n", ans)
	out.Flush()
}
```