20250919

近期做题记录。

CF 720 F

有若干个取尽可能大的,剩下的两两不交,保证覆盖。

通过费用流等手段可以证明答案关于 \(k\) 上凸,于是可以 WQS 二分。(具体地:二分当前斜率为 \(v\),每选一段需要额外 \(-v\),尽可能多选。若取得答案的位置 \(p \ge k\),则 \(l = v\),否则 \(r = v + 1\)。)

\(s_i\)\(a_i\) 的前缀和,枚举右端点 \(r\),对于 \(s_{l - 1} + v \le s_r\) 肯定选,找到能选的最小 \(l\) 标记 \([l, r]\) 已经覆盖。使用树状数组维护。

剩下的考虑覆盖,拿出未被覆盖的位置 \(p_1, p_2, \dots, p_m\)。显然任何经过了它们的区间权值都 \(< 0\),单独选它们一个都是亏的。否则在上一部分被选中,因此不需要额外考虑和上部分冲突的情况。

定义 \(f(l, r) = \min_{l \le i \le r} s_i\)\(g(l, r) = \max_{l \le i \le r}s(i)\),则这部分的答案:

\[g(p_m, n) - f(0, p_1 - 1) - v + \sum_{j=1}^{m-1}\max(g(p_j, p_{j + 1} - 1) - f(p_j, p_{j + 1} - 1) - v, 0) % \max_{p_m \le i \le n}s_i - \min_{0 \le i < p_1}s_i + \sum_{j=1}^{m-1}\max(\min, 0) \]

直接这样写,虽然 \(ans - kv\) 会爆 long long,但是 WQS 二分中,算出来最大次数的值是对的,二分就是对的。带权计算答案的时候,进行了 \(64\) 位有符号自然溢出,加回去之后得到了真实的答案。不需要开 __int128,有点牛。

CF 1630 D

扩展 \(B\) 为能够所有改变正负性的长度。\(b_i \le \lfloor n / 2 \rfloor\)。若已有 \(u, v \in B\),那么 \(|u - v| \in B\),进而 \(\gcd(u, v) \in B\)

只需要考虑翻转长度为 \(d = \gcd b_i\) 的段,记 \(c_i\) 为第 \(i\) 个被翻转的次数,那么对于每个 \(0 \le x < d\),所有 \(i \bmod d = x\)\(c_i\) 之和奇偶性相同。DP 即可。

CF 1630 E

\(c_i\) 为第 \(i\) 种颜色的出现次数,有 \(m\)\(c_i > 0\)。特判 \(m = 1\),剩下情况满足:连续段数等于循环序列上 \(a_i \ne a_{i+1}\) 的个数。

考虑 Burnside 引理,枚举 \(0 \le k < n\),循环移位 \(k\) 个长度,划分成 \(\gcd(n, k)\) 个等价类,每个长度为 \(n / \gcd(n, k)\),内部需要相同。

枚举 \(d = n / \gcd(n, k)\),应当 \(d \mid \gcd(n, \gcd c_i)\),则 \(d \le \min c_i\),因此 \(md \le n\)

\(f(d)\) 表示等价类长度为 \(d\) 时的方案数,合法总方案 \(\sum_{k=1}^{n-1}f(n / \gcd(n, k)) / n\)

\[f(d) = \frac{(n / d)!}{\prod(c_i / d)!} \]

\(g(d)\) 表示等价类长度为 \(d\) 时,所有合法方案的连续段数之和。fix \(a_1 \neq a_n\),计算剩余情况的方案数,然后 \(\times n\)

\[\begin{aligned} g(d) &= n\sum_{u \ne v} \frac{(n / d - 2)!}{\prod(c_i/d)!}(c_u/d)(c_v/d) \\ % &= \frac{nf(d)}{(n/d)(n/d-1)}\sum_{u \ne v}(c_u/d)(c_v/d)\\ &= \frac{nf(d)}{(n/d)(n/d-1)}\left(\left(\sum_{i=1}^m(c_i/d)\right)^2-\sum_{i=1}^m(c_i/d)^2\right)\\ \end{aligned} \]

最终答案:

\[\frac{\sum_{k=1}^n g(n / \gcd(n, k))}{\sum_{k=1}^n f(n / \gcd(n, k))} \]

事实上:(Polya 经典结论)

\[\sum_{i=1}^n f(n / \gcd(i, n)) = \sum_{d \mid n}f(n / d)\sum_{i=1}^n[\gcd(i, n) = d] = \sum_{d \mid n}f(n / d)\varphi(n / d) = \sum_{d \mid n}f(d)\varphi(d) \]

于是总时间复杂度 \(O(n)\)

CF 1630 F

整除是个偏序集,小的向大的连边,那么删点得到的新图,不存在一个点同时有入边和出边。

\(x\) 拆成 \(in(x)\)\(out(x)\)。新图中有边 \(u \to v\),则 \(u, v\) 不共存,\(in(x) \to out(x)\)

原图中 \((x, y) \in E\),只有 \(out(x) \to in(y)\) 合法。

\(in(x) \to in(y), in(x) \to out(y), out(x) \to out(y)\)

求出最大独立集。

新图也是偏序集,那么 Dilworth 定理:

最大独立集 = 最长反链 = 最小链覆盖 = 点数 - 再次拆点二分图最大匹配。

QOJ 1841

抽屉原理,\(\{S_i, S_{i+1}, T_i, T_{i+1}\}\) 必然存在相同,则 \(LCS(S_iS_{i+1}, T_iT_{i+1}) \ge 1\),进而 \(LCS(S, T) \ge n\)

\((S, T)\) 是好的,要么形如 \(ABAB\dots ABA, CtCt\dots CtC(t \in \{A, B\})\)。要么 \(S, T\) 偶数位都为 \(C\),且对于奇数位,能找到一个 \(k(1 \le k \le n)\) 使得 \(\forall 1 \le i \le k, S_{2i-1} = A, T_{2i-1} = B\),且 \(\forall k + 1 \le i \le n + 1, S_{2i-1} = B, T_{2i-1} = A\)

容易证明这两种情况满足 \(LCS(S, T) = n\),考虑证明只有这两类,考虑归纳,假设 \(n - 1\) 时确定只有这两类情况,进行追加。

分类讨论。

实际计算,枚举谁对应上面的 \(A, B, C\)

第二类不需要交换 \(S, T\)

第一类需要交换 \(S, T\),但是在交换后不能额外统计 \(t\) 全相同的情况。

Luogu 12445 Promet

考虑 \(k = n\) 时,所有点在 \(1 \to n\) 的路径上,则除了 \(n\) 都需要有出度,除了 \(1\) 都需要有入度。考虑容斥,\(f(i, j)\) 表示考虑了第 \(n - i + 1 \sim n\) 的节点,除了第 \(n - i + 1\) 之外,确定有 \(j\) 个点没有入度。

初始 \(f(1, 0) = 1\),转移 \(f(i, j) = (2^{n-i-1}-1)(f(i-1, j) + f(i-1, j-1))\)\(F(i) = \sum_{j}(-1)^jf(i, j)\)

时间复杂度 \(O(n^2)\)

\(k < n\) 需要加入一些不在任何一条路径上的点。把点分成三类:

  1. \(1 \to n\) 上;
  2. 存在 \(1 \to x\) 的路径,不存在 \(x \to n\) 的路径;
  3. 不存在 \(1 \to x\) 的路径。

记第一类为 \(A\),第二类 \(B\),第三类为 \(C\),则只可能有以下类型的边:
\(A \to A, A \to B, B \to B, C \to A, C \to B, C \to C.\)

\(A \to A\) 上面已经解决,先 DP \(A/B \to B\),然后 DP \(C \to A/B/C\)

\(g(i, j)\) 表示考虑 \(A, B\),前 \(i\) 个,有 \(j\) 个是 \(B\)\(A/B \to B\) 的贡献。

\(g(i, j) = g(i - 1, j) + (2^{i-j}-1)g(i - 1, j - 1)\)\(G(i, k) = F(k)g(i, i - k + 1)\)

\(h(i, j)\) 表示考虑 \(A, B, C\),前 \(i\) 个,有 \(j\) 个是 \(C\)\(C \to A/B/C\) 的贡献。\(h(i, j) = h(i - 1, j) + h(i - 1, j - 1)(2^{n-j})\)

\(Ans_k = \sum_i h(n - 1, i)g(n - i - 1, n-i-k)F(k)\)

Dave 的旅行

最短路想到 Dijkstra。原图为 \(G\),跑最短路的新图为 \(G'\)

\(x\)\(G'\) 上所有出边都为 \(c_x\)。把它按照 \(dis_x + c_x\) 加入堆中,从堆中取出后,更新所有能到且之前未被访问的节点,那么第一次更新就得到最短路,每个点只会被入堆一次。

首先考虑树的情况,需要找到所有离 \(x\) 距离在 \(d_x\) 之内的节点,可以直接建点分树。点分树上每个点 \(u\) 把管辖的节点 \(T(u)\) 按照到 \(u\) 的距离排序(BFS 之后就是天然有序的),维护一个指针指向 \(T(u)\) 中第一个没有被访问的节点。

对于不是树的情况,至多只有 \(51\) 条非树边。随便拉出一棵生成树跑树的部分,对剩下的非树边 \((u, v)\),考虑强制经过它,在 \(G\) 上(不是生成树上)跑 BFS,求出所有点到这条边的距离,然后类似做即可。

CF 848 D

\(f(i, j)\)\(S \to T\) 除去 \(S, T\)\(i\) 个点,最大流为 \(j\) 的方案数。

\(g(i, j)\)\(S \to U \to T\) 除去 \(S, T\)\(i\) 个点,最大流为 \(j\) 的方案数。

\(f\)\(g\) 转移:\(f(a, b) \times f(c, d) \to g(a + c + 1, \min(b, d))\)

当前 \(a + c + 1\),DP 计算整一行,枚举 \(a\) 确定 \(c\),枚举 \(b, d\)。单行计算 \(O(n^3)\),总共 \(O(n^4)\)

\(g\)\(f\) 转移需要按顺序转移,否则会算重。

对于同一个 \(g(c, d) = x\),假设选了 \(k\) 次,相当于 \(k\) 个不区分的小球放入 \(x\) 个有区分的容器,可以不放,可以放多个,贡献为 \(\binom{x+k-1}{k}\)

因为算 \(g\) 的时候,只需要上一行的 \(f\)。用这一行的 \(g\) 直接去更新这一行以及后面的 \(f\),此后当前行的 \(f\) 就被确定了。

有效的 \((i, j, k)\)\(O(n^2)\) 的,那么这一部分也是 \(O(n^4)\) 的。

\[\sum_{i = 1}^n \sum_{j = 1}^n \lfloor\min(n / i, n / j)\rfloor = \sum_{k = 1}^n \sum_{i = 1}^n \sum_{j = 1}^n [n / i \ge k][n / j \ge k] = \sum_{k=1}^n \lfloor n/k \rfloor^2 = O(n^2) \]

初始 \(f(0, 1) = 1\)。注意 \(f\) 的第二维最大可以是 \(n + 1\),因为 \(g\) 需要进行一个取 \(\min\) 的操作。

posted @ 2025-09-19 17:14  SZwinsun  阅读(14)  评论(0)    收藏  举报