• [Exercises on 2022.5.3] Dynamic Programming


    例 1. \(\text{CF582D Number of Binominal Coefficients}\)

    不妨将 \(n,k\) 换一个形式:求满足 \(0 \le a+b \le A\)\(p^{\alpha}\mid \binom{a+b}{a}\) 的数对 \((a,b)\) 的个数。事实上我们有

    \(\text{Kummer Theorem}\)\(\binom{a+b}{a}\) 所包含的 \(p\) 的幂次数为 \(a+b\)\(p\) 进制下的进位次数。

    首先由勒让德定理,可以知道\(\binom{a+b}{a}\) 所包含的 \(p\) 的幂次数为

    \[\sum_{i=1}\left\lfloor \frac{a+b}{p^i} \right\rfloor-\sum_{i=1}\left\lfloor \frac{a}{p^i} \right\rfloor-\sum_{i=1}\left\lfloor \frac{b}{p^i} \right\rfloor \]

    事实上,\(\left\lfloor \frac{n}{p^i} \right\rfloor\) 等于 \(n\)\(p\) 进制下去掉后 \(i\) 位所得到的数字,而第 \(i\) 位发生进位的充要条件显然是 \(\left\lfloor \frac{a+b}{p^i} \right\rfloor=\left\lfloor \frac{a}{p^i} \right\rfloor+\left\lfloor \frac{b}{p^i} \right\rfloor+1\),所以结论得证。

    具体 \(\mathtt{dp}\) 过程戳这:\(\rm Link.\)


    例 2. \(\text{[agc028D] Chords}\)

    维护一个拥有多个连通块的状态是不易的,所以我们考虑枚举连通块,再统计此连通块出现的次数。

    这好像还是不好做,圆上的问题考虑破环为链,不妨考虑区间 \(\mathtt{dp}\),用 \([l,r]\) 表示最左点为 \(l\),最右点为 \(r\) 的连通块,我们发现这可以完美地将连通块内的边的端点限制在 \([l,r]\) 之中!这是因为即使点 \(x\) 不属于 \(l,r\) 所在的连通块,这条边也会使得 \(l,r,x\) 连通,从而不满足 "最左点为 \(l\),最右点为 \(r\)" 的条件。这也是区间 \(\mathtt{dp}\) 的基础。

    记辅助数组 \(c(l,r)\) 为区间 \([l,r]\) 中未被连边的点数,\(f(x)\)\(x\) 个点任意连边的方案数,那么转移有

    \[dp(l,r)=f(c(l,r))-\sum_{k=l}^{r-1}dp(l,k)\cdot f(c(k+1,r)) \]

    就是一个容斥。需要注意的是,当 \(c(l,r)\) 为奇数时,内部显然无法两两配对,此时的 \(f\) 值应为零。


    例 3. \(\text{[agc036D] Negative Cycle}\)

    一些闲话:最近效率好低啊……沮丧。这辈子要是能想出来这个转化我就真的牛逼了

    题目中一句比较重要的话是,\(\rm Snuke\) 只会删除他加入的边。

    考虑条件的转化,图中不存在负环等价于存在一组合法的差分约束的解,这是因为如果不存在合法差分约束的解就会一直进行最短路的更新,也就是存在负环。

    记点 \(i\) 的变量为 \(x_i\),由于初始边不能删去,那么一定有 \(x_i\ge x_{i+1}\)。令 \(q_i=x_i-x_{i+1}\),那么就有 \(q_i\ge 0\).

    假设保留了一条边权为 \(-1\)\(i \to j\) 的边,也就是说 \(i < j\) 的话,就会有 \(x_i - 1 \ge x_j\),即 \(x_i - x_j \ge 1\),也就是说 \(q_i + q_{i + 1} + \cdots + q_{j - 1} \ge 1\)。那么也就是 \([i,j)\) 区间和为零时需要删除此边。

    假设保留了一条边权为 \(1\)\(i \to j\) 的边,也就是说 \(i > j\) 的话,就会有 \(x_i + 1 \ge x_j\),即 \(x_j - x_i \le 1\),也就是说 \(q_j + q_{j + 1} + \cdots + q_{i - 1} \le 1\)。那么也就是 \([j,i)\) 区间和 \(>1\) 时需要删除此边。

    另外一个重要的 \(\rm observation\)\(q\) 的取值范围为 \([0,1]\)。考虑有 \(x_i\ge x_{i+1}\),且最小边权为 \(-1\),显然,\(i+1\) 从任意一个 \(<i\) 的点转移而来也只可能比 \(x_i\)\(1\)(即上述不等式取等)。

    然后就可以对 \(q\) 数组 \(\mathtt{dp}\) 了,设 \(dp(i,j)\) 为确定了前 \(i\) 位的 \(q\) 值,且第 \(i\) 位为 \(1\),第 \(j\) 位是离 \(i\) 最近的 \(q\) 值为 \(1\) 的下标。

    我们模拟从 \(dp(i,j)\) 转移到 \(dp(k,i)\) 的过程:

    • 对于边权为 \(-1\) 的边。新增了 \((i,k)\) 这一全零区间,显然端点均在这个区间内的边需要被删除,这个可以用二维前缀和处理;
    • 对于边权为 \(1\) 的边。计算包含点 \(i,k\) 但不包含点 \(j\) 的边,否则会算重。

    复杂度 \(\mathcal O(n^3)\).


    例 4. \(\text{CF1239E Turtle}\)

    令数列 \(\{x\}\)\(\{a_1\}\)\(\{y\}\)\(\{a_2\}\),那么一种合法的行走方式一定是 \(x_1,x_2,\dots,x_i,y_i,\dots,y_n\),并记 \(i\) 为拐点。

    \(\{x\}\) 从小到大、\(\{y\}\) 从大到小排序,显然答案只会不劣 —— 不妨设 \(x_i>x_{i+1}\),如果全选取或完全没选取 \(x_i,x_{i+1}\),那么它们交换没有影响;否则,如果选取靠前的一个,显然 \(x_{i+1}\) 排在前面更优。

    考虑两种方案的增量,假设将拐点从 \(i\) 挪到 \(i+1\),增量就是 \(x_{i+1}-y_i\),显然在拐点向右移的过程中,增量是不减的!考虑到 \(\delta\) 的正负,一共只能有两种方案可能取到最优解:拐点为 \(1\)\(n\).

    那么实际上给定 \(x,y\) 分配后的答案就是

    \[x_1+y_n+\max\left\{\sum_{i=2}^n x_i,\sum_{i=1}^{n-1}y_i\right\} \]

    \(\{a\}\) 中最小的两个数选作 \(x_1,y_n\),那么问题转化为将 \(2n-2\) 个数分成两个大小相等的集合 \(S,T\),最小化 \(\max\{\text{val}(A),\text{val}(B)\}\).

    实现的时候写了个 \(\text{meet-in-middle}\),慢得像坨 *。


  • 相关阅读:
    《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(下)
    《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
    Django之REST framework源码分析
    PythonWEB框架之Tornado
    PythonWEB框架之Flask
    Android 外部存储权限分析
    Javaproject集成log4J 1.x
    [Python]通过websocket与jsclient通信
    基于am3358的lcd输出
    SAP 金税接口增强 BADI
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/16259907.html
Copyright © 2020-2023  润新知