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\)。
上述边可以转化成如下几种情况的路径。
-
\(p_i\cdot p_j \le n\),直接 \(i\to p_i\cdot p_j \to j\),\(dis(i,j)=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\)。
-
\(\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.)提供新思路,提供新视野(?
那就继续下去吧。

浙公网安备 33010602011771号