• 题解:Nonnil


    Problem Statement

    求满足以下条件的正整数列 (A = (A_1, A_2, cdots , A_N)) 的个数:

    • (1le A_ile K)
    • 对于所有的 (i (1le ile M)) 存在一个位置 (j (1le jle N)) 使得 (L_ile A_jle R_i)

    Constraints

    • (1le Nle 10 ^ 9)
    • (1le K le 1500)
    • (1le M le minleft{2 imes 10 ^ 5 , dfrac{K(K + 1)}{2} ight})
    • (1le L_i le R_ile K)
    • 对于所有 (i eq j) ,有 ((L_i, R_i) eq (L_j, R_j))
    • 所有输入的数均为整数。

    solution

    首先考虑只有一对 ((L_i, R_i)) 时候的方案数,简单容斥一下为 (K ^ N - (K - (R_i - L_i)) ^ N)

    那考虑整个题都用容斥定理来做,多个命题都成立相当于在值域上,这些 ([L_i, R_i]) 并起来后没有一个数字出现在其中。

    直接做是 (mathcal O (2 ^ M)) 的。

    考虑优化暴力,发现有些线段 ([L_i, R_i]) 包含了其他小线段,这些线段当然是没有用的。

    然后限制的个数变成了 (mathcal O (K)) 了,算上上面的东西,时间复杂度为 (mathcal O (2 ^ K))

    发现一共只有 (K)((K - x) ^ N) ,所以考虑算这些东西的容斥系数。

    也就是统计长度并大小为 (i) 的线段集合中集合大小为奇数的个数和偶数的个数。

    那么设 (f(i, j, k)) 表示以 (i) 为最右方的端点,线段并大小为 (j) ,奇偶性为 (k) 的线段集合个数。

    这个状态是基于将线段按右端点排序从左往右加入设出的。

    设线段为 ([L_i, i]) ,其中 (L_i) 表示右端点为 (i) 时的合法的最右侧的左端点。

    那么有两种转移,一种是对于原先最右端点 (kin [0, L_i - 1]) 中,另一种是对于最右端点 (kin [L_i, i]) 中的,转移分别是:

    [f(i, j, 0) leftarrow f(k, j - (i - L_i + 1), 1) ]

    [f(i, j, 0) leftarrow f(k, j - (i - k), 1) ]

    左边是 (1) 的时候同理。

    可以发现这个东西是 (mathcal O (K ^ 3)) 的。

    第一个转移的第二项是不变的,所以维护 (pre(i, j, l) = sum_{k le i} f(k, j, l)) 即可。

    第二个转移的第一项和第二项的差是不变的,所以维护 (dia(i, j, l) = sum_{kle min{i, j}} f(i - k, j - k, l))

    然后就得到了一个 (mathcal O (K ^ 2)) 的解法。

  • 相关阅读:
    PAIP.img ROM文件提取APK
    paip.提升程序稳定性最佳实践
    paip.验证码识别序列号的反转
    paip.android APK安装方法大总结系统应用的安装
    paip.php调试脱离IDE VC59
    paip.声音按键音延迟的解决
    paip.提升效率几款任务栏软件vc59
    paip.android 读取docx总结
    paip.C#.NET多线程访问 toolStripStatusLabel VC421
    paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决
  • 原文地址:https://www.cnblogs.com/Ax-Dea/p/15374200.html
Copyright © 2020-2023  润新知