
算法基础课
文章平均质量分 55
没想好M
这个作者很懒,什么都没留下…
展开
-
2021ccpc女生重现赛 I - 驾驶卡丁车
2021ccpc女生重现赛 I - 驾驶卡丁车原创 2022-12-20 15:06:17 · 156 阅读 · 0 评论 -
CUC ACM CCPC 2020 女生赛
题意概括:最大价值=所有顶点数-所有边数。每出现一对(x,y)边数加1,可以考虑用并查集,同一集合的根节点保存该集合的总点数,总的边数,最后用总边数-总点数。原创 2022-12-20 15:01:52 · 295 阅读 · 0 评论 -
卡特兰数
889. 满足条件的01序列思路:把所有序列抽象成一条一条不同的路径,假设0是向右走,1是向上走,所以就是从(0,0)→(n,n),有多少条合法的路径,因为sum(0)>=sum(1),所以就是从(0,0)→(n,n)在指向y=x上及下面,既是不经过y=x+1这条线有多少条路径。所有的路径为C(2n,n),不合法的路径(经过y=x+1的)C(2n,n-1),就是从(0,0)→(n-1,n+1)的所有路径C(2n,n-1),所以最终答案就是C(2n,n)-C(2n,n-1),化简之后为C(2n,n)原创 2022-02-25 16:00:04 · 639 阅读 · 0 评论 -
贪心问题
区间问题AcWing905 区间选点题意:有n个闭区间,在数轴上选一点使所有区间至少覆盖一个点,求出最少点的数量。思路:以右端点来取,从小到大枚举右端点,每次把点加在未覆盖点的区间的右端点,可得到最少的数量。#include<iostream>#include<algorithm>using namespace std;const int N=1e5+10;struct range{ int l,r;}edge[N];int cmp(range x,ra原创 2022-02-25 15:48:46 · 629 阅读 · 0 评论 -
最短路问题
注意与最小生成树的区分:①边的权重全都相同,可以用prim和Kruskal算法。 ②权值不相同,就要用以下的算法。一、单源最短路1、所有边都是正数①朴素的Dijkstra算法(适用于稠密图,用邻接矩阵存图)O(n^2)思想:每次将离起点最近的点加入起点所在的集合S,然后更新每个点到集合S的最小距离。步骤:①初始化距离memset(d,INF,sizeof(d)),d[1]=0;②循环遍历不在集合S中的且离S最近...原创 2022-02-25 14:23:31 · 640 阅读 · 0 评论 -
容斥原理
1、容斥原理,对于集合Si有,|S1∪S2∪...∪Sm|=|S1|+|S2|+...+|Sm|-|S1∩S2|-...+|S1∩S2∩S3|...ACWing 890. 能被整除的数题意:给定一个整数 n 和 m 个不同的质数 p1,p2,…,pm。请你求出 1∼n 中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。思路:①1~n中p的倍数的个数:n/p。②因为p1,p2...是质数,所以1~n种能同时整除p1,p2..的个数为n/(p1*p2*...*pm)。③容斥原理,|Sp原创 2022-02-14 11:42:02 · 549 阅读 · 0 评论 -
组合数
885. 求组合数 I(1<=n<=10000,1<=a,b<=2000)题意:给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cbamod(109+7) 的值。思路:公式:C(i,j)=C(i-1,j)+C(i-1,j-1),根据这个公式之间递推。#include<iostream>using namespace std;const int N=2010,MOD=1e9+7;int a[N][N];void init(){ for(int原创 2022-02-14 10:51:20 · 349 阅读 · 0 评论 -
逆元、扩展欧几里得算法、高斯消元
1、定义:若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a(整除),则存在一个整数 x,使得 a/b≡a*x(modm),则称 x 为 b 的模 m 乘法逆元,记为 b^(−1)(modm)。2、b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^(m−2 )即为 b 的乘法逆元。性质1:b*b^(-1)==1(modm)。ACWing876. 快速幂求逆元题意:给定 n 组 ai,pi,其中 pi 是质数,求 ai 模 pi 的乘法逆元,若逆元不存在则输原创 2022-02-14 10:36:33 · 329 阅读 · 0 评论 -
week3 离散化+二进制+双指针+区间合并
离散化:将一个可能原本看起来很大的范围,但实际上里面的内容是很稀疏的,所以可以通过映射到一个较小的区间里来缩小范围,使它们的值是一一对应上的。核心代码:vector<int> alls;sort(alls.begin(),alls.end());//要先进行排序,后面才能方便去重alls.erase(unique(alls.begin(),alls.end()),alls.end());//二分求出x对应的离散化的值int find(int x){ int l=0,r=al原创 2021-09-27 00:01:17 · 388 阅读 · 0 评论