← Home
```go
package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type Element struct {
	val int
	idx int
}

var (
	cnt   []int
	sum_L []float64
	sum_R []float64
	pow2  []float64
)

func build(u, l, r int) {
	if l == r {
		cnt[u] = 0
		sum_L[u] = 1.0
		sum_R[u] = 1.0
		return
	}
	mid := (l + r) / 2
	build(u*2, l, mid)
	build(u*2+1, mid+1, r)
	pushUp(u)
}

func pushUp(u int) {
	left := u * 2
	right := u*2 + 1
	cnt[u] = cnt[left] + cnt[right]
	sum_L[u] = sum_L[left] + sum_L[right]*pow2[cnt[left]]
	sum_R[u] = sum_R[left]*pow2[cnt[right]] + sum_R[right]
}

func activate(u, l, r, pos int) {
	if l == r {
		cnt[u] = 1
		sum_L[u] = 0.5
		sum_R[u] = 0.5
		return
	}
	mid := (l + r) / 2
	if pos <= mid {
		activate(u*2, l, mid, pos)
	} else {
		activate(u*2+1, mid+1, r, pos)
	}
	pushUp(u)
}

func query_R(u, l, r, ql, qr int) (int, float64) {
	if ql <= l && r <= qr {
		return cnt[u], sum_R[u]
	}
	mid := (l + r) / 2
	if qr <= mid {
		return query_R(u*2, l, mid, ql, qr)
	}
	if ql > mid {
		return query_R(u*2+1, mid+1, r, ql, qr)
	}
	cnt_left, sumR_left := query_R(u*2, l, mid, ql, qr)
	cnt_right, sumR_right := query_R(u*2+1, mid+1, r, ql, qr)

	return cnt_left + cnt_right, sumR_left*pow2[cnt_right] + sumR_right
}

func query_L(u, l, r, ql, qr int) (int, float64) {
	if ql <= l && r <= qr {
		return cnt[u], sum_L[u]
	}
	mid := (l + r) / 2
	if qr <= mid {
		return query_L(u*2, l, mid, ql, qr)
	}
	if ql > mid {
		return query_L(u*2+1, mid+1, r, ql, qr)
	}
	cnt_left, sumL_left := query_L(u*2, l, mid, ql, qr)
	cnt_right, sumL_right := query_L(u*2+1, mid+1, r, ql, qr)

	return cnt_left + cnt_right, sumL_left + sumL_right*pow2[cnt_left]
}

func main() {
	input, _ := io.ReadAll(os.Stdin)
	head := 0

	nextInt := func() int {
		for head < len(input) && input[head] <= ' ' {
			head++
		}
		if head >= len(input) {
			return 0
		}
		res := 0
		for head < len(input) && input[head] > ' ' {
			res = res*10 + int(input[head]-'0')
			head++
		}
		return res
	}

	n := nextInt()
	if n == 0 {
		return
	}

	elements := make([]Element, n)
	for i := 0; i < n; i++ {
		elements[i] = Element{val: nextInt(), idx: i + 1}
	}

	sort.Slice(elements, func(i, j int) bool {
		if elements[i].val == elements[j].val {
			return elements[i].idx < elements[j].idx
		}
		return elements[i].val > elements[j].val
	})

	cnt = make([]int, 4*n+1)
	sum_L = make([]float64, 4*n+1)
	sum_R = make([]float64, 4*n+1)
	pow2 = make([]float64, n+5)

	pow2[0] = 1.0
	for i := 1; i <= n; i++ {
		pow2[i] = pow2[i-1] * 0.5
	}

	build(1, 1, n)

	pL := make([]float64, n)
	pR := make([]float64, n)
	nSq := float64(n) * float64(n)

	totalSum := 0.0
	for i := 0; i < n; {
		j := i
		for j < n && elements[j].val == elements[i].val {
			j++
		}

		for k := i; k < j; k++ {
			idx := elements[k].idx
			_, pL[k] = query_R(1, 1, n, 1, idx)
		}

		for k := i; k < j; k++ {
			idx := elements[k].idx
			activate(1, 1, n, idx)
		}

		for k := i; k < j; k++ {
			idx := elements[k].idx
			_, qL := query_L(1, 1, n, idx, n)
			pR[k] = 2.0 * qL
		}

		for k := i; k < j; k++ {
			term := float64(elements[k].val) * 0.5 * pL[k] * pR[k]
			totalSum += term / nSq
		}

		i = j
	}

	fmt.Printf("%.9f\n", totalSum)
}
```