Live2D

Solution Set -「PTS Simus」“待天地再静默一秒”

\[\mathfrak{Defining~\LaTeX~macros\dots} \newcommand{\floor}[1]{\left\lfloor #1\right\rfloor} \newcommand{\lcm}[0]{\operatorname{lcm}} \newcommand{\ceil}[1]{\left\lceil #1\right\rceil} \newcommand{\mex}[0]{\operatorname{mex}} \]

03.11

准备好 制造混乱 BOOM!

  还是没熟练应对三题场啊… 思考效率挺低的. 下来想几下就都会了.

  别用大样例调参! 别用大样例调参! 别用大样例调参!

A. 太阳照常升起 (exam)

  给出积性函数 \(\tau(p^c)=(-1)^c\), \(\xi=\tau\star I\), 求

\[\sum_{i=1}^n\sum_{j=1}^m\xi(ij). \]

  \(n,m\le10^{12}\).


  • 「A.数学-数论」

  设 \(\xi\) 在某个 \(p\) 的 Bell 级数为 \(\Xi(z)\), 显然有

\[\Xi(z)=\frac{1}{(1+z)(1-z)}=\frac{1}{2}\left(\frac{1}{1+z}+\frac{1}{1-z}\right), \]

于是可以快速发现结论

\[\operatorname{SEQ}~\Xi(z)=\lang 1,0\rang^{+\infty}. \]

所以 \(\xi(n)\) 即 "\(n\) 是完全平方数" 的真值.

  省略一些奇奇怪怪的思路试错, 我们可以通过枚举 \(i\) 的出现奇数次的素因子积 (\(j\) 出现奇数次的素因子积也应当如此), 来拆掉一层和式. 不妨设 \(n\le m\), 有:

\[\textit{ans}=\sum_{k=1}^n\mu(k)^2\floor{\sqrt{n/k}}\floor{\sqrt{m/k}}. \]

注意其中 \(\mu(k)^2=\mu(k)\cdot\mu(k)\), 限制了 \(k\) 只能是不同素数的一次幂乘积. 到此我们已经有了 \(\mathcal O(n)\) 的算法.

  由于 \(\mu(p)^2=1=I(p)\), 对喜欢 Powerful Number 的兔诱惑巨大! 来尝试以此求出 \(\sum_{k=1}^n\mu(k)^2\), 设 \(\mu\cdot\mu=f\star I\), 那么

\[\sum_{k=1}^n\mu(p)^2=\sum_{i=1}^nf(i)\sum_{j=1}^{n/i}I(j), \]

还是利用 Bell 级数可知 \(F(z)=1-z^2\), 这样就有 \(\mathcal O(\sqrt n)\) 求单点前缀和的算法. 很可惜 \(\mathcal O(n^{3/4})\) 还是过不了.

  [KEY] 但是! 我们的任务始终是求出答案而非 "根号个前缀和"! 既然求不了, 我们不妨把 \(f\) 带回到原和式中:

\[\textit{ans}=\sum_{i=1}^nf(i)\sum_{k=1}^{n/i}\floor{\sqrt{n/(ki)}}\floor{\sqrt{m/(ki)}}. \]

注意到有意义的 \(i\) 一定是完全平方数. 因而又可以写成

\[\textit{ans}=\sum_{i=1}^{\floor{\sqrt n}}f(i^2)\sum_{k=1}^{n/i^2}\floor{\sqrt{n/(ki^2)}}\floor{\sqrt{m/(ki^2)}}. \]

可以两次整除分块算… 吗? 复杂度:

\[\begin{aligned} T(n) &\sim \sum_{i=1}^{n^{1/3}}(n/i^2)^{1/2}+\sum_{i=1}^{n^{1/3}}i^{1/2}\\ &\sim n^{1/2}\int_0^{n^{1/3}}\frac{\text dx}{x}+\int_0^{n^{1/3}}x^{1/2}\text dx\\ &\sim \mathcal O(\sqrt n\ln n). \end{aligned} \]

结束. 顺带一提, \(f(i^2)=\mu(i)\), 回溯几步可以得到另一种推导路径, 只不过这个方法对兔更有启示罢了.

Remark.

  没想到可以把 \(f\) 带回去算. 该说 PN 这些东西该被当成一种转化手段而非 "求前缀和的模板". 当然其他任何算法都是这样.

  啊… 不知道这个复杂度是不是严格的, 两项的复杂度并没有平衡, 可能可以通过一些手段算出更严的上界.

B. 丧钟为谁而鸣 (exam)

  给定序列 \(\{a_n\}\) 和比例常数 \(p\%\). 进行 \(m\) 次区间赋值或区间查询, 查询时回答出所有在区间出现次数最多的颜色. 但若出现次数小于 \(p\%\) 倍区间长度, 则不需回答.

  \(p\ge 20\), \(n\le10^5\), \(m\le3\times10^4\).


  • 「A.随机化」「B.Tricks」

  就, 随机化嘛. 珂朵莉树维护同色段, 每次询问在区间上测试 \(C\) 次: 随机一个位置, 查询其颜色在区间的出现次数, 然后按照要求保留答案. 单次测试的正确率是 \(\mathcal O(p\%)\) 的, 所以 \(C\)\(100\) 左右就能做到全局的 \(99.999\%\) 以上的正确率. 可以 \(\mathcal O(mC\log n)\), 不过 \(n,m,C\) 没有平衡, 可能需要用一些根号算法平衡复杂度.

  还有一种不基于随机化的做法. [TRICK] 我们可以维护一个 \(r=\ceil{1/p\%}\) 元组进行摩尔投票, 每次新入元素尝试与出现次数最少的元素抵消或替代. 显然出现占比超过 \(p\%\) 的数不会被票出, 我们只需要最后检查剩下的 \(r\) 个数是否满足条件即可. 粗糙实现可以做到 \(\mathcal O(mr^2\log n)\), 这个算法明显更优秀, 谢谢「绪山真寻重度依赖」www.

C. 老人与海 (exam)

  给定 \(\{a_n\}\), \(q\) 次询问, 每次给出 \(h\), 求

\[G(z)=\prod_{i=1}^n\frac{1}{1-z^{a_i}} \]

从低到高第一项系数 \(\ge h\) 的项, 或指出其不存在.

  \(n\le5\), \(a_i\le10\), \(q\le100\), \(h\le10^{15}\).


  • 「A.数学-生成函数」「B.Tricks」

  \(G(z)\) 不方便提取系数的原因是 \(a_i\) 不同, 而它们都在无穷级数中呈现, 因而我们没法化简也没法暴力算. [KEY] [TRICK] 既然如此, 我们可以将不同的 \(a_i\) 放在有穷的地方, 然后暴力求出对应多项式. 当然, motivation 是不平凡的, 构造是信手拈来的, 令 \(w=\lcm_{i=1}^n\{a_i\}\), 构造

\[G(z)=\frac{1}{(1-z^w)^n}\prod_{i=1}^n\frac{1-z^w}{1-z^{a_i}}, \]

看, 前面无穷的都一样, 后面有穷的随你怎么不一样都可以直接来. 设后面的乘积为 \(P(z)\), 那么

\[[z^k]G(z)=\sum_i\binom{n+i-1}{n-1}[z^{k-iw}]P(z). \]

  又显然, \(\forall k\in[1,n]\), 当 \(i<j\)\(i\equiv j\pmod{a_k}\) 时, \([z^i]G(z)\le[z^j]G(z)\). 我们对每个剩余类二分求出最小的合法位置再取最小值作答案即可. 询问复杂度总和精细描述为 \(\mathcal O(q\cdot \min\{a_i\}\cdot wn/w\cdot\log(hn!))\), 分别对应询问次数, 最优剩余类划分数量, 求 \([z^k]G(z)\), 二分上界 (存疑, 这里只毛估了组合数提供的系数), 这一复杂度即 \(\mathcal O(qn\min\{a_i\}(n\log n+\log h))\), 非常快. 可惜求 \(P(z)\) 需要 \(\mathcal O(n^2w)\). 反正出题人肯定没想到这一步, 不知道还能不能优化.

03.12

A. 「计蒜客 #42547」Yuuki and a problem

  Link.

  给定 \(\{a_n\}\), \(q\) 次操作, 每次单点修改或询问 \(a[l:r]\) 的子集和构成集合的 \(\mex\).

  \(n,q,a_i\le2\times10^5\).


  • 「B.Tricks」

  [TRICK] 倍增值域分块. 类似这样的问题: "维护一个 \(s\), 枚举一系列 \(x\), 若 \(s\ge x\), 则令 \(s\gets s-x\)", 我们可以人为划分 \(s\) 的若干阶段. 令在 \([2^k,2^{k+1})\) 内的数的 level 为 \(k\). 当 \(s\) 处于 level \(k\) 时, 若遇到一个 \(\le s\)\(k\) level 的 \(x\), \(s\) 的 level 一定降低; 否则若遇到一系列 level 低于 \(k\)\(x\), 我们可以用数据结构二分 \(s\) 降 level 的位置. 注意我们需要维护的东西之和 level 有关.而和 \(s\) 具体的取值没关系, 这就大大减小了维护成本.

  考虑本题, 先来想想怎么暴力求答案. 初始时令 \(s=0\). 接下来, 若存在未被考虑的 \(\le s+1\) 的数, 令 \(s\) 加上它们的和. 不断增大 \(s\) 直到稳定, 最终答案就是 \(s+1\). 我们可以用倍增值域分块维护这一过程:

  • 初始令 \(s=0\).
  • 检查 \(s+1\) 所在 level 的最小值, 若其大于 \(s+1\), 结束.
  • \(s\) 加上 \(s+1\) 所在 level 的所有数.

  对 \(\log a\) 个 level 维护单点修改区间查询最小值还有和的线段树即可. 复杂度 \(\mathcal O(n\log a_i+q\log n\log a_i)\)

B. 「THUPC 2021」「洛谷 P7603」鬼街

  Link.

  维护序列 \(\{a_n\}\), 初始时 \(a_i=0\). 进行 \(m\) 次操作:

  1. 给出 \(x\), 对于 \(p\mid x\), 令 \(a_p\gets a_p+1\).
  2. 给出 \(x,y\), 监控 \(\{a_p\big|~p\mid x\}\). 当集合内增量和超过 \(y\) 时触发警报.

  回答每次修改操作后触发警报的监控编号.

  \(n,m\le10^5\), \(y<2^{32}\), 强制在线.


  • 「B.Tricks」

  [TRICK] 减半警报器. 监控 \(\sum_{i=1}^ka_i>x\) 的时刻, 转化成监控 \(\exists a_i,~a_i>\frac{x}{k}\) 的时刻. 误触警报至少会让 \(x\gets \frac{k-1}{k}x\), 所以 \(\log\) 次误触后一定真正触发警报. 这个转化的意义在于让 \(a_i\) 独立开来, 降低维护信息的维度.

  知道这个 trick, 这道题就什么都不剩啦.

C. 「CF 633H」Fibonacci-ish II @

  Link.

  维护序列 \(\{a_n\}\), \(q\) 次询问区间去重排序后与 Fibonacci 数列点乘的值, 答案模 \(m\).

  \(n,q\le3\times10^4\), \(\text{TL}=5\text s\).


  • 「A.莫队-一般莫队」

  莫队嘛, 注意 \(\begin{bmatrix}1&1\\1\end{bmatrix}\) 在模意义下仍然恒有逆 \(\begin{bmatrix}1&1\\&-1\end{bmatrix}\), 所以可以在线段树上直接维护答案. 复杂度 \(\mathcal O(n\sqrt q\log n)\), 但是暴力也能过.

D. 「QOJ #4420」Range Reachability Query

  Link.

  给定含 \(n\) 个点 \(m\) 条边的 DAG 和 \(q\) 次询问, 每次询问保留标号在 \([l,r]\) 内的边时, \(u\) 是否可达 \(v\).

  \(n,q\le5\times10^4\), \(m\le10^5\), 数据组数 \(T\le10\), \(\text{TL}=12\text s\).


  • 「A.分块」「B.std::bitset」

  [KEY] DAG 可达性一般没有高妙的维护, 所以应该猜测这是道 bitset 题. 每 \(\omega\) 个询问为一组处理, 先预处理出每条边可用于的询问集合, 然后暴力求可达性即可. 复杂度 \(\mathcal O(T(n+m)q/\omega)\).

E. 「CF 1037H」Security @

  Link.

  给定字符串 \(S\)\(q\) 次询问, 每次询问给出 \(l,r\) 和字符串 \(T\), 求出 \(T\)\(S[l:r]\) 所有字串按字典序排列的后继.

  \(|S|\le10^5\), \(q,\sum|T|\le2\times10^5\).


  有个很一眼的 \(\mathcal O((|S|+\sum|T|+q|\Sigma|)\log n)\) 的 SAM 做法捏.

F. 「ARC 158A」+3 +5 +7

  Link.

  给定 \((a,b,c)\), 每次将其中一个 \(+3\), 另一个 \(+5\), 剩下一个 \(+7\), 求至少多少次操作让 \(a=b=c\).

  \(T\le2\times10^5\), \(a,b,c\le10^9\).


   显然 \(a,b,c\) 奇偶性不同或 \(3\nmid(a+b+c)\) 时无解. 否则显然的贪心策略是让最小值 \(+7\), 次小值 \(+5\), 最大值 \(+3\), 若以 \((a,b,c)\) 大小顺序变化为分界点迭代, 但迭代 \(\mathcal O(1)\) 次后, 会因为出现两个数相等时迭代 \(\mathcal O(a)\) 次, 无法接受, 不过而这时可以直接算答案. 因此 \(\mathcal O(T)\) 完成.

G. 「ARC 158B」Sum-Product Ratio

  Link.

  给定 \(\{a_n\}\), 求 \(\left\{\frac{a_i+a_j+a_k}{a_ia_ja_k}\mid 1\le i<j<k\le n\right\}\) 的最大最小值.

  \(n\le2\times10^5\).


  赛上做法: 排序后, 设最大的负数为 \(a_p\). 用 \((1,2,\star)\), \((n-1,n,\star)\), \((p-1,p,\star)\), \((p,p+1,\star)\), \((p+1,p+2,\star)\) 更新答案. 过了, 经济实惠.

  正解的思路倒是想到: 一个调整优化的思想. 假设固定 \(a_i,a_j\), 考虑此时

\[\frac{a_i+a_j+a_k}{a_ia_ja_k}=\frac{A}{B}\cdot\frac{1}{a_k}+\frac{1}{B}. \]

因而 \(a_k\) 一定取绝对值最小的正数或负数才有意义. 同理可得结论, \((a_i,a_j,a_k)\) 在绝对值最小的三个正数和三个负数中取出. (我们也证明了赛上的乱枪打鸟算法是正确的.) 精细写可以做到 \(\mathcal O(n)\).

H. 「ARC 158C」All Pair Digit Sums

  Link.

  给定 \(\{a_n\}\), 求 \(\forall i,j\in[1,n]\), \(a_i+a_j\) 在十进制下数位和之和.

  \(n\le2\times10^5\), \(1\le a_i\le10^{15}\).


  不怎么结论的题, 比较贴合国人偏好. (暴论

  我们会求个位上的数字和吗? 当然会. 十位或更高位与个位的区别是什么? 可能会被进位影响, 但影响顶多是 \(+1\), 所以自然的思路就是讨论掉这个 \(+1\) 来规约到算个位数字和的情况. 对于第 \(b\) 位的贡献, 将所有数按低 \(b-1\) 位排序后维护第 \(b\) 位各种数码的桶, 双指针维护进位区间和不进位区间, 分两种情况计算贡献即可. \(\mathcal O(n\log a_i)\), 当然也可以再带个 \(\log\).

I.「ARC 158E」All Pair Shortest Paths @

  Link.

  给定 \(2\times n\) 的表格 \(\{a_{ij}\}\), 求两两格子间带权最短路之和, 答案模大素数.

  \(n\le2\times10^5\)


  • 「A.DP-动态 DP」「A.数据结构-平衡树」

  来一个调试失败的粗犷做法.

  虽然很想猫树分治但兔不会, 我们不如嗯上 DDP. 我们只考虑从 \((r_1,c_1)\) 走到 \((r_2,c_2)\)\(c_1<c_2\) 的路径贡献. 假设当 \((r_2,c_2)\) 固定时, 对于当前枚举到的一列 \(c<c_2\), 当 \(r=0\) 时, 从 \((r,c)\)\((r_2,c_2)\) 的最短路为 \(f_0\), \(f_1\) 同理. 那么对 \(\begin{bmatrix}f_0&f_1\end{bmatrix}^T\) 的转移可以写成矩阵乘法 (\(\times\gets\min\), \(+\gets +\)):

\[\begin{bmatrix}f_0\\f_1\end{bmatrix}\gets\begin{bmatrix}a&a+b\\a+b&b\end{bmatrix}\begin{bmatrix}f_0\\f_1\end{bmatrix}, \]

其中 \(a=a_{0,c}\), \(b=a_{1,c}\). 其实这个乘法的性质并不好, 我们没有办法将许多向量合在一起维护. 不过, [KEY] 观察到转移矩阵很对称, 我们可以尝试手动讨论取 \(\min\) 的情况.

  不妨设 \(f_0\le f_1\), 此时 \(f_0'=a+f_0\) 是平凡的. 对于 \(f_1'\), 当 \(a+b+f_0\le b+f_1\), 即 \(f_0-f_1\le-a\) 时, \(f_1'=a+b+f_0\), 否则 \(f_1'=f_1+b\). 从整体维护的角度看, 我们用 \(f_0-f_1\) 的取值落在的区间就能讨论出所有矩乘的情况, 每种情况内部的变化同意, 可以打标记维护. 这里用非旋 Treap 就能方便地分裂和维护区间. 时间复杂度 \(\mathcal O(n\log n)\), 常数不管兔的事了. (

03.13

  希望明天凌晨的室友不要打鼾. (

  然后因为模拟赛打爆了开始想一些 OI 无关的杂七杂八的事情, 突然想到前几天和某人聊天时说起自己年少 (比现在年轻一点) 时的梦想.

  "即使此时此刻也是如此的梦想."

  复燃的余烬或是烟花?

  找个时间闲个话好了.

A. 「ICPC 2014 WF」「洛谷 P6900」Sensor Network (exam)

  Link.

  给定平面上 \(n\) 个点求欧式距离 \(\le d\) 意义下的一个最大团.

  \(n\le100\).


  • 「A.构造」「A.网络流–最大流/最小割」

  考试题加强了一下问题形式所以随机冲不过了. /kk

  我们需要一个很构造性的转化. 枚举团直径点对是自然的尝试, 此后注意到:

  [KEY] 仅有红蓝点间可能出现距离超过直径的情况, 即矛盾关系构成二分图. 我们成功将最大团转化成了二分图最大独立集, 求最小割构造方案即可.

B. 「ARC 134E」Modulo Nim (exam) ^

  好了好了兔知道自己抄过题解又以为自己没做过所以不敢开这道题的事了.

C. 「JOISC 2017」「LOJ #2393」门票安排 (exam)

  Link.

  给定 \(m\) 种区间, 第 \(i\) 种覆盖 \([a_i,b_i]\), 有 \(c_i\) 个. 你可以任意地把区间 \([l,r]\) 翻转成 \([1,l]\cup[r,n+1]\), 求 \([i,i+1]\) 被覆盖次数最大值最小可以是多少.

  \(n\le2\times10^5\), \(m\le10^5\).


  • 「C.性质/结论」「C.思维」

  什么多 key 神曲 (?

  [KEY] 注意到一个区间和其翻转恰好覆盖了所有位置一次, 而若两个不交的区间同时被翻转, 新覆盖是旧覆盖的超集, 一定不优. 因此存在一个 \(p\), 使得 \(p\) 属于所有被翻转的区间.

  设 \([i,i+1]\) 最终被覆盖 \(b_i\) 次, 初始时被覆盖 \(a_i\) 次. 继续考察 \(p\) 位置的特殊性质, [KEY] 又注意到, \(b_p+1\ge \max\{b_i\}\), 否则我们可以减少翻转区间来减少答案. 另一方面, 我们大概是需要二分 \(\max\{b_i\}\), 而当其已知, \(b_p\)\(\mathcal O(1)\) 个取值, 也就是说, 我们这是可以知道最终会被翻转多少个区间.

  之后呢? 二分后从左到右贪心翻转右端点最大的区间即可. 直接用堆维护可用翻转可以做到 \(\mathcal O(n\log n\log \sum c_i)\).

D. 「HNOI 2014」「洛谷 P3235」江南乐

  Link.

  自己看题.jpg


  整除分块求 SG, 你这也太板了. (

E. 「SDOI 2019」「洛谷 P5363」移动金币

  晚安.

posted @ 2023-03-11 17:32  Rainybunny  阅读(193)  评论(0编辑  收藏  举报