std for 近期刷的题
作者:互联网
CF592D Super M(2200)
\(\mathcal O(n)\) 暴力建虚树,答案即为 \((n-1)\times 2-mx\)(\(n\) 为虚树总点数,\(mx\) 为虚树直径),时间复杂度 \(\mathcal O(n)\)。
CF601B Lipshitz Sequence(2100)
易证,最大值只会出现在相邻两个数之间,不会跨过数。由于要求区间子段的答案,那么肯定不能暴枚,考虑维护一个数在多少子段内可作为最大值,可 fhq
\(\mathcal O(n \log n)\) 维护,也可单调栈 \(\mathcal O(n)\) 维护。时间复杂度 \(\mathcal O(qn)\)。
CF601C Kleofáš and the n-thlon(2300)
设 \(f_{i,j}\) 表示前 \(i\) 项比赛中获得总分为 \(j\) 的期望人数。那么答案即为 \(1+\sum\limits_{i=1}^{sum-1}f_{n,i}\)(其中 \(sum\) 为所有 \(c_i\) 的总和)。转移方程显而易见:\(f_{i,j}=\frac{\sum\limits_{k=1}^{m}f_{i-1,j-k}(k \ne c_i)}{m-1}\)。转移时用前缀和优化。时间复杂度 \(\mathcal O(nm)\)。
CF1338A Powered Addition(1500)
如果这一个数比前一个大,就这么留着显然是最优的。如果这一个数比前一个小,我们二进制计算它至少需要几轮操作才能比前一个更大,取最大值即可,时间复杂度 \(\mathcal O(n \log n)\)。
CF1338B Edge Weight Assignment(1800)
考虑第一问,若树上所有叶子节点之间距离均为偶数,那么答案即为 \(1\),否则可用如下方法分配:在 \(1\) 号点为根的情况下,我们把到根节点距离为奇数的叶子节点称为奇点,类似定义偶点。若奇点的距离为 \(2k+1\),我们从上到下填入 \(2k\) 个 \(3\) 和一个 \(1\)。若偶点的距离为 \(2k\),我们从上到下填入 \(2k-1\) 个 \(3\) 和一个 \(2\),易知这样是正确的,故只需要 \(3\) 种颜色。
考虑第二问,如果若干个叶子节点父亲相同,这些节点所连边的权值也必须相同,否则随便填,一定可以满足,算一下每个点叶子儿子个数即可。
时间复杂度 \(\mathcal O(n)\)。
CF1338C Perfect Triples(2200)
找规律。
- \(a\) 的取值把序列分成了若干块,每一块内的 \(a\) 都是从 \(2^k\) 到 \(2^{k+1}-1\) 的连续整数。
- 同一块内,\(b\) 的取值可以递归构造。每次将大块分成四小块,分别取第 \(1,3,4,2\) 小的值。
- 同一块内,\(c\) 的取值可以递归构造。每次将大块分成四小块,分别取第 \(1,4,2,3\) 小的值。
CF842E Nikita and game(2800)
由于多条直径间定有相交部分,那么维护 \(s1,s2\) 分别表示相交部分左右的点。那么每次加点直径要么不变要么变大。如果不变,对应集合加点即可。如果变,清空对应集合,判断另一个集合的点,距离为新直径加入即可。易证复杂度正确。时间复杂度 \(\mathcal O(n \log n)\)。
AT4754 [ABC126F] XOR Matching(1770)
简单构造。首先若 \(k \ge 2^m\),无解。其次,由 \(0⊕1⊕\cdots ⊕ (2^m-1)=0\) 启发,按如下方法构造 \((0,1,2,\cdots,2^m-1)(不包括 \ k)\),\(k\),\((0,1,2,\cdots,2^m-1)(不包括 \ k)\),\(k\)。时间复杂度 \(\mathcal O(n)\)。
AT3884 [ARC090D] Number of Digits(2891)
分类讨论。
观察到 \(S \leq 10^8\),那么当 \(l < 10^7\) 时,\(r <= 23000000\),尺取即可。
当 \(l \ge 10^7\) 时,有 \(f(r)-f(l) \leq 1\),枚举区间长度 \(t\),假设 \(t\) 由 \(x\) 个数位 \(f(l)\) 的数和 \(y\) 个数位 \(f(l) + 1\) 的数组成,于是有:\(\begin{cases}x+y=t\\f(l)\times x+(f(l)+1)\times y=S\end{cases}\)。
整理得 \(f(l)\times t=S\)。然后枚举长度 \(t\)(\(t \leq \lfloor\frac{n}{8}\rfloor\)),分类讨论 \(f(r)-f(l)\) 的值即可。时间复杂度 \(\mathcal O(可过)\)。
CF770C Online Courses In BSU(1500)
如果必修课程在环内,则无解,否则有解,tarjan
判环加拓扑排序模拟即可。时间复杂度 \(\mathcal O(m)\)。
CF1421D Hexagons(1900)
暴力模拟到周围 \(6\) 点的最小花费,分类讨论即可。时间复杂度 \(\mathcal O(1)\)。
CF1421E Swedish Heroes(2700)
考虑到所有合法的分配方案都满足一个简单的性质:\(2 \times p+q \equiv 1 \pmod 3\)(其中 \(p\) 为 -
的个数,\(q\) 为 +
的个数)和至少存在一对相邻且符号相同的数。数学归纳易证。
由此,设 \(f_{i,j,0/1,0/1}\) 表示考虑了前 \(i\) 个数,\(2 \times p+q\equiv j \pmod 3\),第 \(i\) 个数的符号为 -
或 +
,否/是存在至少一对相邻且符号相同的数,的答案。
边界 \(f_{1,2,0,0}=-a_1\),\(f_{1,1,1,0}=a_1\)。
转移方程:
\[f_{i+1,(j+2)\pmod 3,0,t|(k==0)} \leftarrow f_{i,j,k,t}-a_{i+1}\\ f_{i+1,(j+2)\pmod 3,1,t|(k==1)} \leftarrow f_{i,j,k,t}+a_{i+1} \]时间复杂度 \(\mathcal O(n)\)。
CF855E Salazar Slytherin's Locket(2200)
数位 dp
板子。模板 可看这。
先差分,再记 \(f_{i,j,k}\) 表示在 \(i\) 进制下有 \(j\) 位,并且每个数字出现次数的奇偶性是 \(k\) 的数的个数。
转移方程:\(f_{i,j,k}=\sum\limits_{m=0}^{i - 1}f_{i,j-1,k⊕2^{m}}\)。
时间复杂度 \(\mathcal O(\log_b(r)2^bb^2)\)。
CF711C Coloring Trees(1700)
记 \(f_{i,j,k}\) 表示前 \(i\) 个点,第 \(i\) 个点染为 \(j\),分成 \(k\) 段的最小花费。
转移方程:
- 第 \(i\) 个点已被染色:\(f_{i,col_i,k}=\min(f_{i,col_i,k},f_{i-1,lst,k-(lst==col_i?0:1)})\)。
- 第 \(i\) 个点未被染色:\(f_{i,j,k}=\min(f_{i,j,k},f_{i-1,lst,k-(lst==j?0:1)}+cost_{i,j})\)。
时间复杂度 \(\mathcal O(nkm^2)\),可用 st
表优化到 \(\mathcal O(nkm\log m)\)。
CF710D Two Arithmetic Progressions(2500)
直接分治。
- 若 \(\max(a1,a2) < 10^3\),枚举 \(x \in [l,l+a1\times a2]\),对于符合条件的,答案累加 \(\lfloor\frac{r-x}{a1\times a2}\rfloor+1\),时间复杂度 \(\mathcal O(a1\times a2)\)。
- 否则,暴力枚举所有满足第二个条件的数,判断一下是否可行即可,时间复杂度 \(\mathcal O(\frac{r-l}{a2})\)。
总时间复杂度 \(\mathcal O(可过)\)。
CF590C Three States(2200)
可以发现图只有一种情况:即可以找到一点与三个联通块相连。
那么对于每个点,bfs
计算它与三个联通块的距离之和,取最小值即可。
时间复杂度 \(\mathcal O(nm \alpha)\)。
CF1151F Sonya and Informatics(2300)
设有 \(m\) 个 \(0\),那么题意就是让 \(a[1,m]\) 均为 \(0\),\(a[m+1,n]\) 均为 \(1\)。
令 \(f_{i,j}\) 表示 \(i\) 个操作后,前 \(m\) 个数中有 \(j\) 个 \(0\) 的方案数,答案即为 \(\frac{f_{k,m}}{\sum\limits_{i=0}^{m}f_{k,i}}\),边界:\(f_{0,p}=1\),\(p\) 为原序列前 \(m\) 个数中 \(0\) 的个数。
对于 \(f_{i,j}\),考虑它是如何转移来的:
- 之前有 \(j-1\) 个 \(0\),第 \(i\) 次交换换来一个 \(0\),由于前面 \(1\) 的个数与后面 \(0\) 的个数均为 \(m-j+1\),顾方案数为 \(f_{i-1,j-1}\times (m-j+1)^2\)。
- 之前有 \(j + 1\) 个 \(0\),第 \(i\) 次交换换走一个 \(0\),由于前面有 \(j+1\) 个 \(0\),后面有 \(n-m-(m-j-1)=n-2m+j+1\) 个 \(1\),顾方案数为 \(f_{i-1,j+1}\times (j+1)(n-2m+j+1)\)。
- 之前本来就有 \(j\) 个 \(0\),第 \(i\) 次操作没换走也没换来,四种情况:前面交换,后面交换,前后交换 \(0\),前后交换 \(1\),则方案数为 \(C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j)\)。
到这里差点结束了,总结:\(f_{i,j}=f_{i-1,j-1}\times (m-j+1)^2+f_{i-1,j+1}\times (j+1)(n-2m+j+1)+C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j)\)。
考虑到 \(k\leq 10^9\),经验告诉我们直接上矩阵快速幂,毕竟这转移无需判断。
\[\begin{bmatrix}c_0& b_1& 0 & 0&\cdots & 0\\ a_0 & c_1 & b_2 & 0&\cdots & 0\\ 0 & a_1 & c_2 & b_3 & \cdots & 0\\ 0&0&a_2&c_3&\cdots&0\\ 0&0&0&a_3&\cdots&0\\ \cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\ 0&0&0&0&\cdots&c_m\end{bmatrix} \times \begin{bmatrix}f_{i-1,0}\\f_{i-1,1}\\f_{i-1,2}\\f_{i-1,3}\\f_{i-1,4}\\ \cdots \\f_{i-1,m}\end{bmatrix}=\begin{bmatrix}f_{i,0}\\f_{i,1}\\f_{i,2}\\f_{i,3}\\f_{i,4}\\ \cdots \\f_{i,m}\end{bmatrix} \]其中 \(a_i=(m-i)^2\),\(b_i=i(n-2m+i)\),\(c_i=C_{m}^{2}+C_{n-m}^{2}+i(m-i)+(m-i)(n-2m+i)\)。
时间复杂度 \(\mathcal O(n^3\log k)\)。
标签:std,复杂度,个数,近期,times,cdots,2m,mathcal 来源: https://www.cnblogs.com/orzz/p/16217949.html