1 条题解

  • 0
    @ 2025-8-24 23:11:03

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar vegetable_king
    全身全霊!MORE MORE JUMP!!

    搬运于2025-08-24 23:11:03,当前版本为作者最后更新于2025-03-17 11:52:45,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    可能更好的阅读体验

    最构式的一集。

    下面定义原题中输入的八个变量依次为 A,B,C,D,E,F,G,HA, B, C, D, E, F, G, H

    不考虑多边形面积非零这条限制,我们相当于是在统计自然数八元组 (a,b,c,d,e,f,g,h)(a, b, c, d, e, f, g, h),满足:

    • (a,b,c,d,e,f,g,h)(a, b, c, d, e, f, g, h)(A,B,C,D,E,F,G,H)(A, B, C, D, E, F, G, H) 偏序(不一定严格);
    • $a \cdot (0, 1) + b \cdot (-1, 1) + c \cdot (-1, 0) + d \cdot (-1, -1) + e \cdot (0, -1) + f \cdot (1, -1) + g \cdot (1, 0) + h \cdot (1, 1) = (0, 0)$。

    最后将答案减去 $\min(a, e) + \min(b, f) + \min(c, g) + \min(d, h) + 1$ 即可。

    跳过一些推导,我们可以得到:

    ae=fb+dhcg=fb+hda - e = f - b + d - h\\ c - g = f - b + h - d\\

    将其改写成下列形式:

    $$P = e - a, X = b - f, Q = g - c, Y = d - h\\ X - Y = P\\ X + Y = Q\\ $$

    定义 calc(A,B,x)calc(A, B, x) 为满足 0aA,0bB,ab=x0 \le a \le A, 0 \le b \le B, a - b = x 的自然数对 (a,b)(a, b) 个数,那么有 $calc(A, B, x) = \max(\min(A, B - x) + \min(0, x) + 1, 0)$。

    令 $f_a(x) = calc(E, A, x), f_b(x) = calc(B, F, x), f_c(x) = calc(G, C, x), f_d(x) = calc(D, H, x)$,那么对于一对 X,YX, Y,答案为 fa(XY)fb(X)fc(X+Y)fd(Y)f_a(X - Y)f_b(X)f_c(X + Y)f_d(Y),可以 O(1)O(1) 计算,那么我们枚举 X,YX, Y 即可做到 O(N2)O(N^2)

    考虑少枚举一维。calc()calc(*) 显然是一个只有 O(1)O(1) 段的分段一次函数,对于一个确定的 YY,定义 fY(X)=fa(XY)fb(X)fc(X+Y)f_Y(X) = f_a(X - Y)f_b(X)f_c(X + Y),那么 fYf_Y 是一个只有 O(1)O(1) 段的分段三次函数,它的断点由 fa,fb,fcf_a, f_b, f_c 的断点平移后合并得到。考虑对每一段做个插值就能快速算出一段的 fYf_Y 之和。这样对于一个确定的 YY,可以 O(1)O(1) 计算 XfY(X)\sum_X f_Y(X),那么我们枚举 YY 即可做到 O(N)O(N)

    继续优化。定义 f(Y)=fd(Y)XfY(X)f'(Y) = f_d(Y) \sum_X f_Y(X),我们尝试用类似的方法优化之。可以感觉到,fYf'_Y 应该是一个只有 O(1)O(1) 段的分段五次函数 (fYf_Y 是三次,求和后变成四次,乘上 fd(Y)f_d(Y) 变成五次,如果不知道具体是几次的话试试就好了),同时它的断点应该就是 fa,fb,fcf_a, f_b, f_c 的断点的相对位置改变的所有点与 fdf_d 断点合并的结果,原因大概是当 fa,fb,fcf_a, f_b, f_c 的断点相对位置不变时我们可以简单刻画出 f(Y)f'(Y) 的变化。具体证明应该也是可以的,但是比较麻烦。

    fa(XY)f_a(X - Y) 的断点会随着 YY 的增加向右移动,fc(X+Y)f_c(X + Y) 的断点反之,fb(X)f_b(X) 的断点则不动。那么我们可以枚举每对断点求出它们碰撞的时间,再加上 fdf_d 的所有断点,来得到 fYf_Y 的所有断点。对于每一段再跑一次插值即可做到 O(1)O(1),但是带一坨常数

    • 1

    信息

    ID
    11670
    时间
    2000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者