【题解】 CF1086F 分析 插值 扫描线

首先 观察这个时间巨大无比,所以考虑基于离散的东西去统计它。

让 $f(x)$ 表示时间 $x$ 的燃烧区域大小。 则可以先求出最后的燃烧区域大小 $s$,答案为 $s\times(t+1)-\sum_{x=0}^{t} f(x)$。

考虑只有一个块形态没有发生改变的块的一段时间内怎么统计。

对于一个块,每次 $f(x)$ 的增加量就是 $\text{露在外边的角 - 包在里面的角 + 边数}$,而 $\text{露在外边的角 - 包在里面的角}$ 在形态没有改变的时候是不变的,边数的增加量只与目前边数相关,而边数的增长是线性的,只有在角处会多出或减少一条边。

那么 $f(x)$ 是一个二次函数。

我们可以将时间分成 $O(n^2)$ 段,每段图形都没有发生新的形状改变,因为图形发生形状的改变本质是“角”之间的位置关系的改变,就是两个初始燃烧点对应的扩展区域的横坐标或者纵坐标从不交变得相交。

然后求出每个时间段内的二次函数的式子,如果要算内角和外角的数量比较复杂,还会涉及到图形的封闭与开放,不如直接求三个值,然后做插值求出二次函数的式子,再做求和。

求单个 $f(x)$ 值可以用扫描线做到 $O(n\log n)$,时间复杂度 $O(n^3\log n)$。

code

做完了才发现是 *3500,很高兴。虽然是 *3500,但是思路很自然,尤其是当对某个函数求值,而定义域较大时,考虑插值,而本题图形的性质可以让函数呈现为分段函数,很精妙。

posted @ 2023-06-29 08:46  寂静的海底  阅读(6)  评论(0编辑  收藏  举报  来源