![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 55
拿来吧你
我还能码嘛。
一直为幸福辛苦
展开
-
AcWing 840. 模拟散列表
#include<iostream>#include<cstring>using namespace std;const int N = 200003, null = 0x3f3f3f3f;int h[N];int find(int x){ //查找到x值应该存放的位置 int k = (x % N + N) % N; while(h[k] != null && h[k] != x){ //如果该位置有人了就向后移一位 .原创 2022-05-11 19:37:51 · 211 阅读 · 0 评论 -
字符串匹配 - KMP
字符串匹配 - KMP思路:用一个数组来存储模板串(短串)来存储最长公共前后缀子串的长度如ne[i]=j表示,a字符的子串a[1~i]中满足a[1~j]=a[i-j~i]中最长的长度j。伪代码 / 模板:for(int i=2,j=0;i<=n;i++){ while(j&&a[i]!=a[j+1]) j=ne[j]; if(a[i]==a[j+1]) j++; ne[i]=j;} for(int i=1,j原创 2021-12-07 23:14:15 · 277 阅读 · 0 评论 -
补题 - Divisible by Seven (7的倍数性质)
题目:Divisible by Seven (CodeForces - 375A)题面:【传送门】思路:今天终于揭开了数字7的神秘面纱。能被 777 整除的数的性质:每次计算 a/10−a%10∗2a/10-a \% 10*2a/10−a%10∗2,如果过程中得到的数是 777 的倍数,那么这个数就是 777 的倍数。文字描述的不清晰,可以结合图理解。知道了这个性质,解题的思路就很明确了:题目说,一定会有 1,6,8,9 四个数字,就可以用他们来拼成 %7\%7%7 得到的7种结果,让其他的原创 2021-08-19 14:37:43 · 204 阅读 · 1 评论 -
搜索 - DFS
搜索 - DFS思路:DFS 即 深度优先搜索。搜索方式:以树形图为例,如果当前的节点满足条件,则继续搜索他的子节点;如果不满足条件,则向上回溯到前一个还有没被访问到的邻接点的父节点,再向下搜索它的子节点。就是不撞南墙不回头,解释不清楚,上代码。伪代码 / 模板:void dfs(int k){ if(k==n){ //本次搜索结束 输出答案 } for(遍历当前节点的邻接点){ if(该点满足){ st[i]=1;原创 2021-08-16 16:20:28 · 75 阅读 · 0 评论 -
最短路 - Floyd算法
最短路 - Floyd算法思路:该算法常用于含有负权图的多次查询多源最短路。从i点到达j点的情况只有2种:1、直接到达j点。2、经过若干个k点到达j点。运用动态规划思想,用mp[i][j]记录从i点到达j点的最短路,可得转移方程:mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j])。时间复杂度:O( n ^ 3 )。伪代码 / 模板:void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++原创 2021-08-15 17:04:52 · 84 阅读 · 0 评论 -
最短路 - spfa算法
最短路 - spfa算法思路:该算法常用于求含负权图的单源最短路,是Bellman_ford算法的优化版。如果a点到终点途中经过b点,那么只有dist[a]更新变小后,dist[b]更新之后才有可能变小。所以spfa算法相较于Bellman-ford算法优化的点就是:只有x的邻点的最短路被更新变小之后,x的最短路才需要进行更新判断,操作通过队列实现。一般时间复杂度:O( m )。最坏时间复杂度:O( n * m )。伪代码 / 模板:int spfa(){ memset(dist,INF,原创 2021-08-15 16:10:36 · 263 阅读 · 0 评论 -
最短路(有边数限制) - Bellman-ford算法
有边数限制最短路 - Bellman-ford算法思路:该算法常用于求含负权图的单源最短路。若1->n可达,令每个点同时向终点的方向更新相邻的点的最短路径,通过n-1次操作,若图中不存在负环,就会到达n点。反之则存在负环时间复杂度:O( n * m )。伪代码 / 模板:int bellman_ford(){ memset(dist,INF,sizeof dist); dist[1]=0; for(int i=0;i<k;i++){ memcpy(back,dist,s原创 2021-08-15 13:51:35 · 154 阅读 · 0 评论 -
最短路 - Dijkstra算法 && 堆优化版
最短路 - Dijkstra算法思路:采用 贪心策略,以1节点为起点,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边。连通部分逐渐扩大,最后一直走到n节点。时间复杂度:O( n ^ 2 ),应用于稠密图。伪代码 / 模板:int Dijkstra(){ memset(dist,INF,sizeof dist); dist[1]=0; //起点到起点的距离为 0 for(int i=0;i<n;i++){ int hp=-1; for(int j=1;原创 2021-08-14 16:30:22 · 207 阅读 · 0 评论 -
最小生成树 - Kruskal算法
最小生成树 - Kruskal算法思路:先将所有边按权重从小到大排序,利用 并查集,枚举每条边,如果该边的两点不在一个集合中,就放在一个集合中 这不废话嘛。时间复杂度:O( m * logm ),引用于稀疏图。伪代码 / 模板:int kruskal(){ sort(e,e+m,cmp); for(int i=1;i<=n;i++) f[i]=i; int ans=0,cnt=0; for(int i=0;i<m;i++){ Edge hp; hp.u=e[i原创 2021-08-13 23:05:06 · 84 阅读 · 0 评论 -
最小生成树 - Prim算法
最小生成树 - Prim算法思路:采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新 新的连通块外延的边。连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。伪代码 / 模板:int prim(){ memset(dist,INF,sizeof dist); //dist[i]表示i节点到连通块的最短路径 //st[i]标记i节点是否在连通块内 int ans=0; for(int i=0;i<n;i++){ int hp=-原创 2021-08-13 14:42:31 · 310 阅读 · 2 评论 -
逆序对模板
P1908 逆序对#include<iostream>using namespace std;int a[500005];int b[500005];long long ans=0;void merge(int l,int r){ if(l==r) return ; int mid=(l+r)/2; merge(l,mid); merge(mid+1,r); int i=l,j=mid+1,k=l; while(i&原创 2020-09-11 19:08:05 · 70 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(3)
2021“MINIEYE杯”中国大学生算法设计超级联赛(3)1009:Rise in Price思路:dalao超详细思路传送门直接爆搜 dfs 遍历 每条 路径 (必然超时) 考虑剪枝 思路如下:代码:#include<iostream>#include<algorithm>using namespace std;const long long N=105;long long ans,n;long long a[N][N],b[N][N],c[N][N原创 2021-08-04 16:57:42 · 74 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(2)
2021“MINIEYE杯”中国大学生算法设计超级联赛(2)1011:I love max and multiply思路:补充 :因为 i & j ≥ k 所以 min ( i , j ) ≥ k ,故 i ≥ k 并且 j ≥ k 。一个 j ≥ i 的数,只要满足 i 的二进制位置上是 1 的,j 相应的位置也必须是 1 就可。代码:#include<iostream>#include<algorithm>using namespace std;ty原创 2021-07-26 23:06:31 · 88 阅读 · 1 评论