
算法讲解
文章平均质量分 61
羽翼__
羽翼未丰,继续努力
展开
-
平衡二叉树(AVL)
平衡二叉树首先是一棵二叉排序树二叉排序树:对于每个节点,左孩子比本身小,右孩子比本身大首先我们来实现一个二叉排序树。//节点结构体struct TreeNode{ int val; //节点值 TreeNode* left; TreeNode* right; TreeNode(int val){ //结构体构造方法 this->val = val; this->left=NULL; this->right=NULL; }};然后是二叉排序树的插入算原创 2020-06-18 17:15:52 · 839 阅读 · 0 评论 -
后缀数组 代码详解
研究了好几天的后缀数组,今天终于是把代码实现给看明白了了。大多数博客都讲解了了后缀数组以及倍增法,但是对于代码的讲解不是很明白。这篇就把LRJ蓝书上的代码拆开来一句一句的进行解释。关于倍增算法我建议去看lrj的数,写的非常清晰明了;基数排序可以去看看百度百科,其实和桶排序是一家子。代码:char s[maxn];int sa[maxn],t[maxn],t2[maxn],c...原创 2020-02-16 21:03:37 · 522 阅读 · 0 评论 -
小于n且与n互素的整数个数:
推导过程略欧拉公式:n(1-1/p1)(1-1/p2)....代码仅供参考:void euler_phi(int n){ int m=(int)sqrt(n+0.5); int ans=n; for(int i=2;i<=n;i++){ if(n%i==0){ ans=ans/i*(i-1); while(n%i==0) n/=i; } } i...原创 2020-01-21 22:12:01 · 1449 阅读 · 0 评论 -
约数的个数
给出n的唯一分解式:n=分解式的解释:pi均为素数,例如20 的分解式为20=n的约数的个数为:(a1+1)*(a2+1).....代码仅供参考:int fun(int n){ int ans=1; for(int i=2;i*i<=n;i++){ if(n%i==0){ int temp=0; while(n%i==0){ temp++; ...原创 2020-01-21 21:51:18 · 297 阅读 · 0 评论 -
素数筛法
筛选n之内的所有素数void Prime(int n){ //素数筛法 memset(isPrime,1,sizeof(isPrime)); int m=sqrt(n+0.5); for(int i=2;i<=m;i++){ if(isPrime[i]) for(int j=i*i;j<=n;j+=i){ isPrime[j]=0; } } }...原创 2019-11-12 16:56:45 · 388 阅读 · 0 评论 -
网络流 EK Dinic算法模板 最大流最小割定理
先把两个模板挂上,然后有时间回来网络流详解写一下,相信大多数刚开始接触网络流的同学也是没大看懂LRJ那本紫书上的讲解,我也是各种查百度,看博客,翻离散,去b站然后弄得明白了一些,不写一下可惜了,周末一定写,先让我理理思路。Edmonds-Karp算法:时间中一般不用这个算法,因为时间复杂度较大struct EdmondsKarp{ struct Edge{ int from,...原创 2019-04-24 14:36:35 · 357 阅读 · 0 评论 -
HDU-3415 单调队列
首先单调队列就是具有单调性的队列。。。算了不废话了,关于单调队列这里有一个对于初学者来说简单明了的博客:链接具体步骤: 若队列为空,将A[i]从队尾入队 若队列不为空,将比A[i]大的元素都从队尾弹出,然后把A[i]入队 若队列不为空且A[i]大于队尾,则直接从队尾把A[i]入队if(q.empty()) q.push_back(A[i]);else if...原创 2019-03-01 12:29:05 · 491 阅读 · 0 评论 -
快速排序的两种写法
#include<bits/stdc++.h>using namespace std;void quick_sort(int* A,int l,int r){ if(l>=r) return; int s=A[l],p=l,q=r; while(p<q){ while(p<q&&s<=A[q]) q--; A[p]=A[q]...原创 2019-02-27 15:09:20 · 228 阅读 · 0 评论 -
UVA11212 Editing a book 启发式迭代加深搜索IDA*算法
题目链接:https://vjudge.net/problem/UVA-11212迭代加深搜:对于可以用深搜但是解答树的深度没有明显上限的题目,可以用迭代深搜,设置一个解答树深度的上限maxd启发式:写一个估值函数h(),预测到目标状态还要多深,当cur+h()>maxd时剪枝。也是刚学还不是很明白,先上题目代码。#include<bits/stdc++.h>...原创 2019-02-24 10:59:29 · 355 阅读 · 0 评论 -
已知三角形三个顶点求内切圆和外接圆半径 以及面积 C语言模板
自己找的公式然后写的,比较低级,希望能有大佬看到能指点我一下有什么更高级的公式。感激不尽!double Length(int x1,int y1,int x2,int y2){ return (double)sqrt(pow(x1-x2,2)+pow(y1-y2,2));} double a=Length(x1,y1,x2,y2);double b=Length(x2,...原创 2019-02-01 23:16:30 · 3723 阅读 · 0 评论 -
求多个数的最大公因数算法 C语言
我们用(a1,a2,....)表示最大公因数 [a1,a2,.....]表示最小公倍数1、两个数的最大公因数 辗转相除法,可以直接使用C语言自带的 c = __gcd(a,b); 辗转相除法原理可以自行百度。2、多个数以上的最大公因数 1、多次辗转相除法 1.使用辗转相除法求a1...原创 2019-01-14 20:50:09 · 8913 阅读 · 4 评论 -
计蒜客 排涝 网络流 增广路算法
题目链接:https://nanti.jisuanke.com/t/36一道正经的网络流题,给了你边以及最大流量,求从能到汇点的最大流量容量:一条边最大容量流量:一条边实际流过的量增广路算法:1.BFS找到一条能够到达汇点的路2.给这条路增加容量,达到能最大能容纳的流量,这一条路的每一段 容量 = 初始流量 - 流量3.如果还有路继续1,否则到44,将所有能到汇点流...原创 2018-11-22 13:18:40 · 393 阅读 · 0 评论 -
NAIPC 2016 Tourist LCA(Lowest Common Ancestors)最近公共祖先
路过的陌生人,进都进来了,留个赞给个鼓励好么题目链接:https://nanti.jisuanke.com/t/32233题目大意就是求两个点之间的距离(两个点满足倍数关系),如果节点数比较少可以拿最短路来写,但是对于200000的输入,O(N^3)肯定不行。所以我们可以预处理找到他们的最近公共祖先先讲题目的做法,再讲LCA公式:两个之间的节点数=公共祖先到A之间节点数+公...原创 2018-11-22 11:15:45 · 278 阅读 · 0 评论 -
最短路径 单源最短路径Dijkstra(迪杰斯特拉)算法 Floyd(弗洛伊德)算法
题目链接:https://nanti.jisuanke.com/t/230两个算法的主要思想都是松弛,就是两点间的距离通过第三点来变短比如 1->3=10 1->2=2 2->3=5 这样你就可以通过2号点把1,3两点的距离缩短为7Dijkstra算法被称为单源最短路,意思就是只能计算某个点到其他点的最短路,而Floyd算法可以计算各个点之间...原创 2018-11-03 11:09:49 · 833 阅读 · 0 评论 -
一片森林之Trie树(字典树)
关于字典树的基础知识我就不多说了,网上的讲解已经很详细了我就直接挂上模板,然后挂两道题目,实在是没大有时间写详细的教程,也懒得写了模板题虽然代码量多点,但是一般比较好想。还有一个想说的就是每个人都有自己的代码风格,只要自己写着顺手别人看得懂就行,不用强行去模仿别人的代码风格(除非你写得真的烂)。第一步:节点声明struct Trie{ int cnt; //这个地方...原创 2018-10-10 21:29:12 · 300 阅读 · 0 评论 -
一片森林之线段树
先上几道线段树的题目,AC代码我放在最后,大家可以先直接看一眼题目,自己想想思路https://nanti.jisuanke.com/t/237http://acm.hdu.edu.cn/showproblem.php?pid=1166http://acm.hdu.edu.cn/showproblem.php?pid=1394首先,线段树是什么?神奇海螺回答:线段树是一种二...原创 2018-09-20 12:20:54 · 330 阅读 · 0 评论