清北学堂 2020 国庆J2考前综合强化 Day5
1. 题目
T1 a
题目描述
题目描述
给一个仅包含字符 .
和 *
的字符串。问是否存在 个 *
,它们的位置构成等差数列。
输入格式
第一行一个整数 表示字符串长度。
第二行一个字符串。
输出格式
yes
或 no
表示是否存在。
样例输入
5
..***
样例输出
yes
样例输入
5
*..**
样例输出
no
数据规模
- 对于 的数据,。
- 对于 的数据,。
Sol
sb 题,直接枚举两个数算出第三个数再 check 即可
T2 b
题目描述
题目描述
给一棵树,点黑白染色。现在要断开若干条边,使得每个连通块都恰好包含一个黑点。问有多少种方案。
输入格式
一行一个整数 表示点数。
接下来一行 个数表示点 的父亲节点(点从 开始编号)。
接下来一行 个数( 或 )表示点的颜色,其中 表示白色, 表示黑色。
输出格式
一行一个数表示答案。答案对 取模。
样例输入
3
0 0
0 1 1
样例输出
2
数据规模
- 对于 的数据 。
- 另有 的数据 。
- 对于 的数据 。
Sol
树形 dp。
记 表示以 为根的子树满足题意且 所在的连通块不包含黑点的方案数。
表示以 为根的子树满足题意且 所在的连通块包含黑点的方案数。
然后直接枚举边 背包转移即可。
即:
T3 c
题目描述
时间限制
题目描述
给一个序列 , 次询问,每次给出 ,要求回答
注:
为求和符号,。
和 含义一样,。
,表示 数组在区间 的最大值。
输入格式
第一行一个整数 。
第二行 个整数表示序列 。
第三行一个整数 。
接下来 行,每行两个整数 表示一个询问。
输出格式
行,每行一个数表示答案,对 取模。
样例输入
5
4 6 1 7 9
2
1 5
2 4
样例输出
511
176
数据规模
- 对于 的数据,。
- 另有 的数据,。
- 对于 的数据,,。
本题 IO 量较大,请视情况斟酌 IO 方式。
Sol
暴力可以获得 30pts .
对序列直接建线段树,每个节点直接维护区间是当前节点所代表区间时的答案。预处理可以暴力 做。
询问的时候考虑把询问拆成 段区间,然后合并。
考虑把 拆成 :
令 ,, 为 的答案。
则询问 的答案为:
令 ,,则上式变为:
对于上式的 那一项,容易发现它的取值是前面一段都等于 ,后面一段都等于 ,考虑二分出一个位置 ,使得 ,,那么上式变为:
因此只要对每段维护 , 的前缀和, 的后缀和与 的后缀和即可。
时间复杂度 ,60pts .
对序列建出区间最大值的笛卡尔树。
对于询问 ,所有可能的最大值都出现在 到 的路径上。
考虑这条路径上的每一个点 ,容易发现,如果 是父亲的右儿子,则没有任何一个 满足 。如果 是父亲的左儿子,那么所有满足 的 恰好是那些 的右子树中的点。
即区间前缀和为 ,则:
那么只要维护 和 即可。
这个直接对到根路径再做一个前缀和就行了。
预处理 lca,复杂度 ,100pts .
T4 d
题目描述
时间限制
题目描述
一张无向图,边上有边权。每个点至少有两条邻边,且邻边的边权互不相同。
起初时刻 ,每个点上有一个人。每到一个新的时刻,每个人都会选择相邻的边权最大的边走过去。但如果这条边是回头路(上一个时刻通过这条边走到当前点),那么这个人就不会选择这条边权最大的边,而会选择次大的边。
现在有 组询问,每个询问给出 ,要求回答在时刻 ,点 上有多少人。
输入格式
第一行两个整数 表示点数和边数。
接下来 行每行三个整数 ,表示 之间有一条边权为 的边。
接下来一行一个整数 表示询问数。
最后 行每行两个整数 表示一组询问。
输出格式
行每行一个整数表示答案。
样例输入
7 8
1 2 5
1 4 3
1 5 6
2 3 7
3 5 8
6 4 10
7 6 5
5 7 1
2
3 8
1 1
样例输出
3
0
*数据规模
- 对于30%的数据,。
- 另有30%的数据,。
- 对于100%的数据,,。无重边自环。
本题 IO 量较大,请视情况斟酌 IO 方式。
Sol
暴力模拟可以拿到 30pts,时间复杂度 .
一个点走 步到了点 就把 ,时间复杂度 ,可以获得 60pts .
把每条有向边看成一个点,这样每个点的出边是唯一确定的。
并且原图中之后最大边和次大边有可能走到,所以这张新图的点数只有 。
这样连出的新图是一个环套内向树森林。
最后询问的时候一个询问被拆成新图上两个点上的询问。
不妨把边反向,变成询问一个点 走 步能走到多少不同的黑点(其中黑点是那些最大边对应的点)。
不妨把询问离线。
如果 不在环上,那么就是询问子树中深度为的黑点有多少个。那么直接做可以启发式合并数组,复杂度 。
其实每次对于当前点,它直接复用了长儿子的数组。然后所有短儿子的数组被暴力合并到这个数组里。这个复杂度其实是所有短儿子子树深度的总和。注意到短儿子其实就是一条长链的顶端,这就是所有长链长度的总和。所以复杂度其实是 的。
或者可以再把一个询问拆成两个分别挂在 dfs 序的左右端点。然后再离线一次询问,把 dfs 序做一个前缀和(从前往后扫,维护当前前缀对应的所有点中,深度为的有多少个,这是一个数组)。然后在左端点把答案减去,右端点加上。复杂度 。
如果 在环上,假设环长是 ,那么一个 步能走到的点, 步也一定能走到。不妨随便固定环上的一个点作为起点,把环拆成链。然后处理出距离它长度为 的点一共有 个(简单路径)。
那么对于询问就是要回答数组 下标模 的前缀和。这个预处理一下前缀和可以 回答。
然后对于不同的询问 ,还要求出它们分别作为起点时,这个数组 是什么。
不妨令环上的下一个点是 。假设已经求出了 对应的数组,现在要求 对应的数组。
这一步其实就是消除掉子树的贡献,然后把的 子树移到环最后(相当于深度 )。最后再把所有点的距离都 。
不妨把深度按照模 进行分类,那么每个类互不相关(因为做前缀和不会跨类)。
因为现在要维护一个前缀和的数组,所以每次修改要对后缀进行加减。这个可以用树状数组来维护。复杂度 。
但是注意到每次的修改是把距离 。换言之,在同一个类中,这些深度对应的位置只往后移了一格。
从而如果修改 个位置,前缀和只会至多修改 个位置。所以暴力修改这些位置,复杂度 。
故总复杂度是线性的。
2. 算法 - 贪心 & 数学
1. 贪心
Problem 1:有 个农民,每个有 单位的牛奶,单价 。现在要求从农民手里购买不超过 单位的牛奶。总共买 单位。求最小花费。
排个序就好了。
Problem 2:有 个物品,每个有大小。有若干容积为 的箱子,在每个里面至多放两个物品。问装下所有物品至少要多少箱子。
排序,最大最小配对。
正确性证明:
设序列中最大值为 ,如果其和最小的 不能放一起,那么显然它只能自己放一个箱子。
那如果可以放,那么最优解中 落单。
如果 也落单了:矛盾若有令一个 使得 和 配对:换成 配对, 落单,显然更优。
若 和 配对了:
若 落单了:则让 配对, 落单,更优。若 和 配对:那么让 配对, 配对更优。
所有情况都使得 配对,Q.E.D.
Problem 3:有 个物品,每个物品有属性 。将其排成一行。
将 物品放在 位置将会产生 的代价,使总代价最小。
先把式子变成 ,其中 是一个常量。
过程:
显然后面是个常量,故 。
按 排序即可。
?????????:求 MST(最小生成树) .
性质:一个点的最小出边一定在 MST 中。
证明:
假设 最短的一条边为 .
那么我们现在考虑将 连接起来(最小生成树的任意两点一定是连通的嘛),那么就只有两种不同的情况,直接连通和间接连通。我们现在就是要证明直接连通至少不比间接连通差。
既然要间接连通,那么假设这条路是 ,其实这个最终连接的效果是可以等效于 的,
然而这里唯一的区别就是一个选择了了 ,一个选择了 ,那么我们知道选择 的代价肯定是不差于 的。证毕。
替换原则:最小生成树一定是最小瓶颈生成树。
证明:
显然
Algorithm 1:Prim 算法
思想:先随便找一个点 ,寻找 的最小出边对应的点 ,然后寻找 的最小出边对应的点 (),,一直操作直到所有点都被找到。
维护 表示目前点 的最小边权,每次寻找最小的 然后更新出边即可。
证明:
由于 MST 的性质,所以全局最小边也在 MST 中。
这就把 Prim 的核心思想证明了。
Q.E.D.
时间复杂度:
Fibonacci 堆 | 普通堆 | |
---|---|---|
稀疏图 | ||
稠密图 |
Algorithm 2:Kruskal 算法
思想:先把边从小到大排序,用并查集维护,每次把不形成环且边权最小的边的两个点并起来,最后得到的就是 MST。
证明:
考虑最小瓶颈生成树的做法
二分一个 ,判断瓶颈 的最小瓶颈生成树是否存在。判断可以用并查集合并,但是发现可以直接枚举合并,这和 Kruskal 的算法过程一模一样。
因为最小生成树一定是最小瓶颈生成树,故 Kruskal 求出的一定是 MST。Q.E.D.
时间复杂度:(若并查集用按秩合并 + 路径压缩)
Algorithm 3:Boruvka 算法
思想:把每条边都连出最小边,然后直接把联通块缩成点,反复操作即可。
证明:
显然
时间复杂度:
Algorithm 4:???算法
先跑 次 Boruvka:。
得到 个点的图。再用 Prim。
时间复杂度 。
2. 数学
2.1 初等数论
约数:定义,对于两个整数 ,若存在一个整数 ,使得 ,则称 是 的约数(因数), 是 的倍数,记做 .
一个数的约数个数是 的,但是 中每个数的正约数个数和是 的:
因为调和级数 ,乘上个 也就是 的了。
质数:定义,对于 ,如果其正约数只有 与 ,则称 为素数(质数),其余除 外都是合数。
素数定理: 以内的素数个数为 .
筛法:
这个思想就是用约数筛掉,时间复杂度 。
当然还有 的线性筛,但普及组不做要求。
判断素数:
- 直接做
- 先做出
isprime
素数表,就能 预处理, 查询了。 - Miller - Rabin 算法,因为太强,不做要求。
- AKS 算法,因为太强,不做要求(多项式时间的确定性算法!)。
算术基本定理:对于任意一个正整数 ,有且仅有一种方法将 表示为如下形式:
其中, 是满足 的素数, 为正整数。
分解质因数:
就是朴素的枚举法分解质因数,时间复杂度 (其实可以再优化下)。
还有 Pollard Rho 算法,因为太强,所以不做要求(时间复杂度 )
最大公约数与最小公倍数:最大的公约数叫最大公约数,记做 ;最小的公倍数叫最小公倍数,记做 .
性质:
- (辗转相除法)
- (更相减损术)
- 设 ,(其中 后面的东西是标准分解, 是随便一个常数),则:
因为 ,所以可以得到如下求 的程序(辗转相除法):
更相减损术:
也是 的,但是只用了乘法和加法,适合高精。
裴蜀定理:对于不全为 的非负整数 ,必然存在整数 ,使得
方程 有解的充要条件为 .
欧几里得算法:
即可求出一组满足上式的解 .
原方程的一组特解 .
所有解为 .
当方程为 时,原方程的解为
代码:
求线性同余方程 ,或判断其无解。
显然这个等同于求解 ,套 exgcd 即可。有解条件就是 。
当 为素数时,我们有费马小定理:
对于任意整数 和素数 ,有:
所以答案为 .
当 时,这东西又叫做 模 的乘法逆元。
求 内的逆元:
先用费马小定理求出 .
利用 倒推出所有阶乘的逆元。
利用等式 求出所有数的逆元。
2.2 组合数学
加法原理:若一个事件可以分为两类,这两类的方案数分别为 ,则这个事件的方案数为 .
乘法原理:若一个事件可以分为两步,这两步的方案数分别为 ,则这个事件的方案数为 .
排列数:有 个不同的物品,从中有序的选出 个物品,这个方案数记做 (或 ).
组合数:有 个不同的物品,从中无序地选出 个物品,
这个方案数记为 (或 )。
可重全排列:有 种物品,物品的总个数为 ,每种物品的
个数分别为 个,它们组成的全排列个数为
可重组合:有 种物品,从中无序地选出 个,同种物品可以选出多次,方案数为 .
隔板法:
不定方程 的正整数解的个数为 .
不定方程 的非负整数解的个数为 .
Catalan 数:
- 通项:
- 递推:
二项式定理:
求组合数 ,结果 .
- 直接用递推式,时间复杂度 .
- 利用公式 ,将 分解素因子,时间复杂度 .
- 还是利用方法二中的公式,但把后面分解质因数的部分修改为:预处理 及其逆元。
时间复杂度 。但有要求:,且 存在对
的逆元。这种方法常用于 为大质数时。 - Lucas 定理,对于任意素数适用,但不作要求。
容斥原理:
特殊情况:
2.3 线性代数
矩阵:
定义:一个 的二维数组:
运算:
- 加减法:,满足交换律和结合律。
- 数乘:,满足对加减法的分配律。
- 乘法:对于一个 的矩阵 和一个 的矩阵 ,其乘积为一个 的矩阵 ,其中:
因为矩阵乘法满足结合律,所以矩阵求幂可以用快速幂。
矩阵加速:求 Fibonacci 数列的第 项 , .
构造一个 的矩阵表示 Fibonacci 数列的相邻两项:
可以发现:
显然初始矩阵是 ,跑个矩阵快速幂即可。
高斯消元法:
求解下列 元线性方程组的解,或判断其无解或无穷多解:
消成斜线即可。
2.4 简单几何
向量:有向线段。
坐标表示:用平面中的点对 表示,此时向量的长度为
点 到原点的距离,方向为点 相对于原点的方向。
- 加减法: .
几何意义:点的平移 - 数乘: .
几何意义:长度变为原来的 倍。 - 点积(数量积或内积): .
几何意义:一个向量的长度乘以另一个向量在它上面的投影的长度。 - 叉积(向量积): .
几何意义:它们组成的平行四边形的有向面积。
正弦定理:对于 的三边长 及其对角 ,,,有:
余弦定理:对于 的三边长 及其对角 ,,,有:
旋转公式:对于平面中的一个点 ,将其绕原点逆时针旋转角 ,得到的新点坐标为
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/13785439.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】