2024.1.18 题选

2024.1.18 题选

早上 fzw 讲计数。我在学校。

CF870F Paths

自己想出的 *2700,但是不会一些细节。

考虑两个点之间的距离有哪几种情况

我们令 \(i<j\)

  • \(i=1\),一定有 \(dis(i,j)=0\),因为不连通。

  • \(\gcd(i,j)\neq 1\),一定有 \(dis(i,j)=1\),因为一步到。

  • 考虑 \(i\perp j\),设两个数的最小质因数为 \(p_i,p_j\),显然 \(p_i \perp p_j\)

也就是说有如下几条边:\(i\to p_i\)\(j\to p_j\)\(p_i \to p_ip_j\)\(p_j \to p_ip_j\)。同时对于任意的正整数 \(k>1\)有, \(kp_i \to kp_j\)。然后由于约束,我们认为 \(k>2\) 一定不优,所以 \(2p_i\to 2p_j\)

上述边可以转化成如下几种情况的路径。

  1. \(p_i\cdot p_j \le n\),直接 \(i\to p_i\cdot p_j \to j\)\(dis(i,j)=2\)

  2. $p_i \cdot p_j >n $ 且 \(\max (p_i,p_j) \le \frac n 2\),可以走 \(i\to 2p_i \to 2p_j \to j\)\(dis(i,j)=3\)

  3. \(\max(p_i,p_j) > \frac n2\)\(dis(i,j)=0\)

统计满足上述条件分别的二元组个数即可。

\(dis(i,j)=2\) 的情况最难,采用正难则反,这个需要分析出来。

剩下的大力推式子即可。会发现答案所依赖的信息通过一次线性筛都可以算出来,所以时间复杂度 \(\mathcal O(n)\)

CF914F

我一开始以为 1kri 讲的是分块套后缀自动机。然后打算换题。然后 jzy 说这题一开始讲的是就 bitset。我就心安理得地把这题用 bitset 搞过去了。

一个经典 trick 是考虑一个字符串的匹配可以理解成字符出现位置构成的 bitset 形成的 and。当然你每一位都要向右移动若干位。

然后你维护一下这个bitset。至于区间,只需差分即可。时间复杂度理论上是 \(O(\frac{n^2+n\sum|y|}{w})\)

P5693 第六分块

dX 讲的恶心数据结构,里比较能写的。

考虑小白逛公园的做法。

对于区间 \([l,r]\) ,要维护 整个区间内的最大子段和 \(ans\),以 \(l\) 为起点的最大子段和 \(lans\),以 \(r\) 为终点的最大子段和 \(rans\),子段和 \(sum\)

我们设这个线段树节点是 \(u\),两个儿子分别是 \(ls,rs\)

\(u_{ans}=\max(ls_{ans},rs_{ans},ls_{rans}+rs_{lans})\)

\(u_{lans}=\max(ls_{lans},ls_{sum}+rs_{lans})\)

\(u_{rans}=\max(rs_{rans},rs_{sum}+ls_{rans})\)

\(u_{sum}=ls_{sum}+rs_{sum}\)

我们发现,如果决策出现变化,会影响所有取决于这个点的决策。如果暴力重构,时间复杂度 \(O(n)\),无法通过。

考虑决策发生变化当且仅当变化量超过某个阈值。

  • 超过阈值,重构子树

  • 不超过阈值,相当于直接区间加。

然后我们发现在两个信息合并时,阈值是往平面坐标轴上扔成直线以后的交点。然后你把维护的四个信息全部变成直线即可。

EI 通过复杂的势能分析,得到时间复杂度是 \(\mathcal O(m\log^4n+n\log^3n+q\log n)\)

这种算法称为 KTT。该题是末日三问、[SNOI2020]区间和的弱化版。

something

事实上,还有昨天两题的,但昨天身体不太舒服,没写笔记,所以先摆了。

感觉做的题好难啊。你让我再写一遍,我也至多有五成把握能在合理时间内写出来。但是感觉也只有这样积累思路才能让自己厚起来。尽管最后这样难度的题依然未必能做出来,但它看起来确实可以为做题的一切(比如暴力 etc.)提供新思路,提供新视野(?

那就继续下去吧。

posted @ 2024-02-29 15:00  wtcqwq  阅读(21)  评论(0)    收藏  举报