← Home
```go
package main

import (
	"fmt"
	"math"
	"sort"
)

func main() {
	var n, h int
	var p float64
	fmt.Scan(&n, &h, &p)

	x := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&x[i])
	}
	sort.Ints(x)

	R := make([]int, n)
	L := make([]int, n)
	for i := 0; i < n; i++ {
		R[i] = i
		for j := i + 1; j < n && x[j]-x[j-1] < h; j++ {
			R[i] = j
		}
		L[i] = i
		for j := i - 1; j >= 0 && x[j+1]-x[j] < h; j-- {
			L[i] = j
		}
	}

	memo := make([][][][]float64, n)
	for i := 0; i < n; i++ {
		memo[i] = make([][][]float64, n)
		for j := 0; j < n; j++ {
			memo[i][j] = make([][]float64, 2)
			for k := 0; k < 2; k++ {
				memo[i][j][k] = make([]float64, 2)
				for l := 0; l < 2; l++ {
					memo[i][j][k][l] = -1
				}
			}
		}
	}

	var solve func(l, r, sl, sr int) float64
	solve = func(l, r, sl, sr int) float64 {
		if l > r {
			return 0
		}
		if memo[l][r][sl][sr] >= 0 {
			return memo[l][r][sl][sr]
		}

		probL, probR := 0.5, 0.5
		if l == r {
			probL, probR = 1.0, 0.0
		}

		var result float64
		fh := float64(h)

		overlap := 0.0
		if l > 0 {
			dist := float64(x[l] - x[l-1])
			if sl == 0 {
				overlap = math.Max(0, fh-dist)
			} else {
				overlap = math.Max(0, 2*fh-dist)
			}
		}
		result += probL * p * (fh - overlap + solve(l+1, r, 0, sr))

		rEff := R[l]
		if rEff > r {
			rEff = r
		}
		overlap = 0
		if rEff == r && r < n-1 && sr == 1 {
			overlap = math.Max(0, float64(x[r]+h)-float64(x[r+1]-h))
		}
		result += probL * (1 - p) * (float64(x[rEff]+h-x[l]) - overlap + solve(rEff+1, r, 1, sr))

		lEff := L[r]
		if lEff < l {
			lEff = l
		}
		overlap = 0
		if lEff == l && l > 0 {
			dist := float64(x[l] - x[l-1])
			if sl == 0 {
				overlap = math.Max(0, fh-dist)
			} else {
				overlap = math.Max(0, 2*fh-dist)
			}
		}
		result += probR * p * (float64(x[r]-x[lEff]+h) - overlap + solve(l, lEff-1, sl, 1))

		overlap = 0
		if r < n-1 {
			dist := float64(x[r+1] - x[r])
			if sr == 0 {
				overlap = math.Max(0, fh-dist)
			} else {
				overlap = math.Max(0, 2*fh-dist)
			}
		}
		result += probR * (1 - p) * (fh - overlap + solve(l, r-1, sl, 0))

		memo[l][r][sl][sr] = result
		return result
	}

	fmt.Printf("%.10f\n", solve(0, n-1, 0, 0))
}
```