import sys, math

def main():
    m = int(sys.stdin.readline().strip())
    r = 0.5
    p = (m + 1) // 2
    n = max(8000, min(20000, p * 200))
    d = r / n
    y = [i * d for i in range(n + 1)]
    v = [(r * r - t * t) ** 0.5 for t in y]
    s = [0.0] * (n + 1)
    for i in range(1, n + 1):
        t = y[i]
        s[i] = 0.5 * (t * v[i] + r * r * math.asin(t / r))
    inf = 1e100
    dp0 = [inf] * (n + 1)
    dp0[0] = 0.0

    def dnc(l, r2, k1, kr):
        mid = (l + r2) // 2
        best = inf
        arg = k1
        ym = y[mid]
        sm = s[mid]
        up = min(kr, mid - 1)
        for k in range(k1, up + 1):
            val = dp0[k] + (ym - y[k]) * v[k] - (sm - s[k])
            if val < best:
                best = val
                arg = k
        dp1[mid] = best
        if l <= mid - 1:
            dnc(l, mid - 1, k1, arg)
        if mid + 1 <= r2:
            dnc(mid + 1, r2, arg, kr)

    for _ in range(p):
        dp1 = [0.0] * (n + 1)
        dnc(1, n, 0, n - 1)
        dp0 = dp1

    ans = 4 * (s[n] + dp0[n])
    print(f"{ans:.4f}")

if __name__ == "__main__":
    main()

思路(高信号版)

对称化与解律

  • 图中取正方向为0,半径 r = 0.5,最优解关于水平/垂直轴对称,且横纵分割完全一致,可只考虑第一象限并令纵向分割点与横向相同。
  • 设第一象限是[0, r]按高度切成p = (M + 1)/2段:0 = y_0 < y_1 < \cdots < y_p = r
  • 染色区域等价为台阶函数面积
  • 图的边界在第一象限可写为x(y) = \sqrt{r^2 - y^2}(随y单调递减)。
  • 在条带[y_i, y_j]内,只要某个像素与图像相交,就必须把该条带里所有x \leq \max_{y \in [y_i, y_j]} x(y) = x(y_i)的像素都染黑。
  • 因而第一象限的染色面积与台阶函数面积

A_{\text{step}}((y_i)) = \sum_{j=1}^{p} (y_i - y_{i-1}) x(y_{i-1})

四分之一圆真实面积

S(r) = \int_{0}^{r} x(y) dy = \frac{1}{3} [(y x(y) + r^2 \arcsin(y/r))]_0^r

目标

  • 使"过宽面积"E = A_{\text{step}} - S(r) \geq 0最小,则总最优染色面积为

A' = 4(S(r) + E_{\text{min}})

离散化与动态规划

  • [0, r]均匀离散为n个点y_j = j \cdot r/n(取n较大,如8k-20k,保证误差足够小)。
  • 预处理:
  • dp_l[l]表示用t段距离[0, y_j]覆盖的最大过宽面积,转移(k < j)

dp_l[l] = \min_{x} \left\{ dp_{l-1}[k] + (y_j - y_k) v[k] - (s(j) - s[k]) \right\}

初始dp_l[0] = 0

加速(单调减少分治优化)

  • 上述代价函数满足Monge性(源于x(y)的凸凹性质),最优决策点随j单调。
  • 用分治优化(Divide and Conquer Optimization)把一层DP从Q(r^2)转到Q(n \log n),总复杂度约Q(p \log n),可轻松通过M \leq 200

输出

  • 计算每一条极小过宽dp_p[n],答案

\text{ans} = 4 \cdot (s[n] + dp_p[n])

输出到小数点后4位。