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,半径
,最优解关于水平/垂直轴对称,且横纵分割完全一致,可只考虑第一象限并令纵向分割点与横向相同。
- 设第一象限是
按高度切成
段:
。
- 染色区域等价为台阶函数面积
- 图的边界在第一象限可写为
(随y单调递减)。
- 在条带
内,只要某个像素与图像相交,就必须把该条带里所有
的像素都染黑。
- 因而第一象限的染色面积与台阶函数面积
四分之一圆真实面积
目标
- 使"过宽面积"
最小,则总最优染色面积为
离散化与动态规划
- 将
均匀离散为
个点
(取
较大,如8k-20k,保证误差足够小)。
- 预处理:
- 设
表示用t段距离
覆盖的最大过宽面积,转移
:
初始。
加速(单调减少分治优化)
- 上述代价函数满足Monge性(源于
的凸凹性质),最优决策点随
单调。
- 用分治优化(Divide and Conquer Optimization)把一层DP从
转到
,总复杂度约
,可轻松通过
。
输出
- 计算每一条极小过宽
,答案
输出到小数点后4位。

京公网安备 11010502036488号