我的算法笔记
日常收录算法
谁砍了我的二叉树
嘻嘻,加油^0^~
展开
-
超级恶心的输入
题目描述:给你N个整数, 拜托你帮我找找在这些所有的数字中组合可能的最大公约数 (greatest common divisor)Input第一行输入一个N (1 < N < 100) 表示样例的数量。 接下来N行每行有 M (1 < M < 100) 个正整数,请寻找其中的最大公约数.(M不需要你输入)Output输出每一行的最大公约数Input27 5 ...原创 2020-05-07 15:24:04 · 184 阅读 · 0 评论 -
普通汉诺塔和变种汉诺塔
普通汉诺塔:可以在三个塔上任意移动。递推:对于n个盘子,我们可以把它分成n-1个盘子和最后一个大盘子。设F(n)为移动所需步数,那么对于n个盘子来说所做的事情就是将n-1个盘子借助C柱移动到B柱上,这一过程移动的步数为F(n-1),下一步我们将大盘子移动到C柱上,此时需要一步,最后,我们再将n-1个盘子借助A柱移动到C柱上,此时需要的步数仍为F(n-1)。综合以上分析,F(n)=2F(n-1)+1。对两边同时加上1可以凑成一个等比数列,然后就可以求出其通项公式2^n-1。变种汉诺塔:只能在相邻的塔原创 2020-08-01 09:21:26 · 363 阅读 · 0 评论 -
并查集(及优化)
并查集:在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集hdu所有题目(点击)思路:原始int find(int a){ int r = a; while(s[r] != r) //寻找根结点 r = s[r]; return r;}void ...原创 2020-04-21 20:44:54 · 215 阅读 · 0 评论 -
类似斐波那契数的求解(利用周期)
题目出处(点击)Problem DescriptionA number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.Given A, B, and n, you are to calculate the value of f(n).InputT...原创 2020-04-21 21:12:45 · 191 阅读 · 0 评论 -
Frogger:Floyd,Dijkstra算法的拓展
问题描述:湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距...转载 2020-05-04 15:02:15 · 176 阅读 · 0 评论 -
最短路的扩展:Dijkstra
题目描述:N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。Input多组输入,第一行给一个T。每一组第一行给两个数n和m。(1 <= n <= 1000)接下来m行,每行三个数u,v,w代表路径的两个端点与边权。(1 <= u,v <= n , 0< w <= 1e6)保证两点间只有一条边,该图为无向图。...转载 2020-05-06 11:26:03 · 230 阅读 · 0 评论 -
单调队列&栈
单调队列&栈1.单调队列说明应用2.单调栈说明应用1.单调队列说明单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。应用1. 刚刚接触单调队列,就只做过一道经典例题,(洛谷滑动窗口),这道题还是很理解的,就是求区间长度为K的最大值,最小值,用单调队列存长度为K最值的下标。对着代码看更容易理解:我是原创 2020-08-07 13:44:43 · 106 阅读 · 1 评论 -
分块&莫队算法
分块&莫队算法分块二级目录分块优美的暴力:分块1.分块:顾名思义,就是把待处理的整个大区间分成若干块。2.口诀是:块外暴力,块内查表。3.那么这个块的大小应该怎么分呢?应该是sqrt(n)大小。证明就不说了自己查资料。4.自我感觉,分块很巧妙的把各种复杂度都向sqrt(N)靠近发现很多的题,都是时间复杂度n根号n,空间复杂度也是n根号n,而且不管是什么操作,基本上都是根号n。既没有n^2,也不存在O(1),感觉,巧妙地把复杂度平均了一下。5.分块虽然是暴力,但是是一种非常有水平的暴力原创 2020-08-12 16:47:52 · 267 阅读 · 1 评论 -
RMQ(模板)
概述:RMQ(Range Minimum/Maximum Query),即区间最值查询,在一个序列中多次查询区间(l,r)中最大值,然而解决RMQ需要对ST算法有着深刻的理解ST算法的实现ST算法是一种解决静态询问区间最值问题的高效离线算法,算法上采用了倍增的思想,而实现上则是利用了动态规划。利用一个二维数组,而 f[i][j] 就代表这 [i,i+2^j-1] 范围上的最值。然后在把 [i,i+2^j-1] 拆分成 [i,i+2 ^ (j-1)-1]和[i+2 ^ (j-1),i+2 ^ j-原创 2020-08-22 15:25:06 · 202 阅读 · 0 评论 -
强连通分量缩点Tarjan算法
题目:听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗?Input多组测试数组,以EOF结束。第一行两个整数N和M(1<=N<=1000, 1<=M<=2000),表示人数和联系对数。原创 2020-09-18 16:11:15 · 108 阅读 · 0 评论 -
倍增求LCA
1.倍增是什么?请看我的另一篇文章 RMQ2.什么是LCA?Least Common Ancestors:顾名思义,最近并且公共的祖先,如下图H和M的LCA是E。(这个算法我也是看了好久,才有点顿悟)suan’fasuanfa#include <bits/stdc++.h>using namespace std;const int maxn = 5e5+10; int tot,n,m,s,ver[2*maxn],head[2*maxn],nxt[2*maxn];int f[原创 2020-10-08 09:42:08 · 120 阅读 · 0 评论 -
矩阵快速幂与构造矩阵
矩阵快速幂模板和快速幂模板原理一样struct node { ll mat[15][15];//定义矩阵}x,y;int le;void init(node &ans){ memset(ans.mat,0,sizeof(ans.mat)); for(int i=0;i<le;i++) ans.mat[i][i]=1;}node mul(node x,node y){ node ans; for(int i=0;i<le;i++) for(int j=原创 2021-01-17 10:47:14 · 131 阅读 · 0 评论 -
01规划(二分)
传送门题目大意:给出n个物品的重量和价值,选k件,计算选的k件的最大单位价值题解:赤裸裸的01规划,利用二分的思想。我们设单位价值为x,且x = Σv / Σc所以我们要对单位价值进二分答案,由上面的公式可以得到 Σv - Σc * x = 0,如果我们选取的v和c使这个式子>0的话,说明至少还有一组v和c可以使得x更大:Σv - Σc * x > 0。这就是:x < Σv / Σc,所以我们就可以依照这个式子得到每个物品的权值,然后进行排序,选出最大的k个,进行Σv - Σc .原创 2021-01-18 10:32:01 · 695 阅读 · 1 评论