2024.7 做题记录

409. P10704 救赎(Redemption)

不依赖 \(a_i \le 10^9\) 的做法。

\(b_x\) 为有多少个 \(i\) 使得 \(a_i = x\)

设一个阈值 \(B\)。当 \(\frac{m}{a_i a_j} > B\)\(a_i a_j < \frac{m}{B}\),可以直接枚举 \(a_i\)\(a_j\) 然后利用 \(b\) 数组统计。这部分时间复杂度为 \(O(\frac{m}{B} \ln \frac{m}{B})\)

\(\frac{m}{a_i a_j} \le B\) 时,统计 \(\left\lfloor\frac{m}{a_i a_j}\right\rfloor\) 之和可以转化为对于一个整数 \(k \in [1, B]\),有多少对 \((i, j)\) 满足 \(x \le \frac{m}{a_i a_j}\)\(x \cdot a_i \cdot a_j \le m\)。可以排序后双指针统计。这部分时间复杂度为 \(O(nB)\)

总时间复杂度为 \(O(\frac{m}{B} \ln \frac{m}{B} + nB)\)。取 \(B = 350\) 可以通过。

410. P10716 【MX-X1-T4】「KDOI-05」简单的字符串问题

一个 \(A\) 合法的充要条件为:

  • \(A\)\(S_{1 \sim i}\) 的一个 border;
  • \(A\)\(S_{1 \sim i}\) 中不重叠地出现 \(\ge k\) 次。

建出失配树后,发现合法的 \(A\) 在树上组成一条某个点 \(u\) 到根的链,且 \(u\)\(i\) 的祖先。因此我们若知道 \(u\),答案就是 \(dep_u\)

考虑倍增求出 \(u\)。相当于要 check 这样一个问题:

  • \(S_{1 \sim u}\) 的第 \(k\) 次不重叠出现位置是否 \(\le i\)

考虑预处理出每个前缀 \(S_{1 \sim u}\) 对应的串在整个串中的不重叠出现位置。相当于每次找到一个位置后面第一个后缀,使得它与整个串的 LCP 长度 \(\ge u\),然后跳到它。跳的步数最多是 \(\sum\limits_{i = 1}^n \frac{n}{i} = O(n \log n)\) 所以可以暴力跳。

一个后缀与整个串的 LCP 长度可以想到 Z 函数。用并查集维护链表的 trick,从小到大枚举 \(u\),处理完 \(u\) 后把 \(z_p = u\) 的所有位置 \(p\) 删了,使得处理到 \(u\) 时,并查集中 \(z_p \ge u\) 的位置为代表元。这样即可 \(O(\alpha(n))\) 求出一个位置后面第一个 \(p\) 使得 \(z_p \ge u\)\(p\)

注意特判 \(k = 1\)

总时间复杂度 \(O(q \log n + n \alpha(n) \log n)\)

411. CF1975F Set

412. CF1732E Location

413. CF1677E Tokitsukaze and Beautiful Subsegments

唉,套路题。

求出以每个 \(p_i\) 作为最大值的区间范围 \(l \in [L_i, i], r \in [i, R_i]\)。再找到全部 \(p_a \cdot p_b = p_i\) 的位置 \((a, b)\),那么同时包含 \(i, x, y\) 且是 \([L_i, R_i]\) 的子区间的区间 \(l \in [L_i, x], r \in [y, R_i]\) 是合法的。

于是原问题变成了一个矩形覆盖矩形求和的问题。太困难。

但是发现矩形有交当且仅当它们从同一个 \(i\) 产生,所以可以对于所有的 \((x, y)\) 做一个类似单调栈的东西(就是去除所有覆盖范围被其他 \((x, y)\) 完全包含的点对),然后就可以转化成矩形加矩形求和。可以树状数组解决。

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

414. CF961F k-substrings

发现往头尾各添加一个字符后,border 的长度至多增加 \(2\)

于是按串长从小往大推即可,哈希判一下当前的长度是否为 border。

posted @ 2024-07-07 16:27  zltzlt  阅读(46)  评论(0编辑  收藏  举报