![](https://img-blog.csdnimg.cn/20191106110300795.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
回顾算法
回顾学习过的算法
btc_runes
没什么意思的人!
展开
-
C++手动实现HashTable
思路都写代码注释上了头文件:#ifndef _HASHTABLE_H_#define _HASHTABLE_H_#include <iostream>#include <list>#include <memory>#include <queue>/*元素节点类*/class Node { public: Node(int key = 0, int val = 0, bool isexit = false) : _key(k原创 2021-10-28 09:52:59 · 286 阅读 · 0 评论 -
分组背包问题
有NNN 组物品和一个容量是 VVV 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vijvijvij,价值是 wijwijwij,其中 iii 是组号,jjj 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,VN,VN,V,用空格隔开,分别表示物品组数和背包容量。接下来有 NNN 组数据:每组数据第一行有一个整数 Si,Si,Si,表示第 $i $个物品组的物品数量;每组数据接下来有原创 2020-11-16 20:25:45 · 193 阅读 · 0 评论 -
快速排序
对于网上一些博客的讲解,按单向划分方式,我们以数组中最左边的xxx做为划分,然后利用尺取法,小于等于xxx的划分到xxx的左边,大于等于xxx的划分到xxx的右边,然后进行分治划分,这样均摊时间复杂度是O(nlogn)O(nlogn)O(nlogn)的,但是对于最坏的情况(已经排好序),呢么每次划分的区间长度都是按上一次划分的区间长度减 1 的,这样最坏的时间复杂度为 O(n2)O(n^2)O(n2),所以我们需要用另一种方式来划分,从而避免最坏情况的发生,我们划分的值,取中间值,这样就可以避免,区间长度每原创 2020-11-10 13:30:27 · 111 阅读 · 0 评论 -
浅谈扩展gcd(exgcd)+例题P1082
今天考完马原,下午在家睡了一下午,晚上啥也学不进,就复习一下exgcd的知识,以模板题为例。同余方程题目描述求关于 xxx 的同余方程 ax≡1ax≡1ax≡1 (mod b) 的最小正整数解。输入格式一行,包含两个正整数 a,b用一个空格隔开。输出格式一个正整数 xxx,即最小正整数解。输入数据保证一定有解。分析1: ax≡1ax≡1ax≡1 (mod b) =ax+by=gcd(a,b)=ax+by=gcd(a,b)=ax+by=gcd(a,b)2: 为什么等于 1 呢?由于题原创 2020-06-15 23:10:38 · 444 阅读 · 0 评论 -
实现大数加法函数
写一个简短的大数加法的函数(说实话模拟还是花了10分钟的时间,不同的进制只需要修改进制数即可)string add(string a, string b){ int lena = a.size() - 1, lenb = b.size() - 1, d = 0, x; string c; while (lena >= 0 || lenb >= 0) { if (lenb < 0 && lena >= 0)原创 2020-06-03 18:23:03 · 501 阅读 · 0 评论 -
树上倍增:求LCA(u,v)
求LCA(u,v)的三种方法:1:rmq+dfs()序2:并查集+dfs()3:树上倍增然而听说1,2两种方法不怎么火热,3是目前最受欢迎的,故我就跟随大众潮流,学了树上倍增求LCA(u,v)的方法树上倍增:利用了rmq的思想,首先定义一个pre[i][j]数组,pre[i][j] 表示 i 往上走 2^j 层所表示的父辈,根据倍增关系,我们可以得到:pre[i][j]=pre[pr...原创 2020-01-01 17:16:01 · 226 阅读 · 0 评论 -
(Poj 1797) Heavy Transportation最短路变形(spfa)
题解:题目链接一道最短路的变形,利用spfa()扩展 1-->n的所有路,然后求出最大的承重量即可AC代码:#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<queue>using namespace std...原创 2019-12-28 21:45:19 · 157 阅读 · 0 评论 -
线段树之懒人标记
学了四次线段树终于把懒标给搞明白了,虽说明白了,但也不是太过熟悉,所以写一个博客来记录一下讲解:线段树的区间修改一般需要用到懒人标记,但是为什么要用懒人标记,这是一个很值得思考的问题。例如我们要修改一个区间的信息,我们当然可以使用单点修改,来实现区间信息的修改,但是每次修改的时间复杂度是O(logn),修改n次的时间复杂度为O(nlogn),显然时间复杂度太高了,所以懒人标记就出现了...原创 2019-12-16 13:56:56 · 636 阅读 · 0 评论 -
关于线段树建树的一修改
这里写一下昨天写的bug,出现问题了,找了很久也不知道哪里出问题了,最后学姐帮我找到了,十分感激区间求和查询操作ll query(ll k,ll l,ll r){ if(tree[k].l==l&&tree[k].r==r) { return tree[k].sum; } ll mid=tree[k].l+tree[k].r...原创 2019-12-13 14:56:09 · 113 阅读 · 0 评论 -
第七周周赛题解
yzj学长的即兴发挥一道简单的暴搜题,如果你没写出来,说明你最近可能没有好好的写专题不讲解,自行看代码理解:AC代码:#include<stdio.h>//#include<algorithm>#include<string.h>//#include<queue>//using namespace std;#define maxn ...原创 2019-12-08 17:15:16 · 1020 阅读 · 0 评论 -
二进制枚举子集
先了解一下二进制:如果我们把二进制中的每个数看作一个状态时,则二进制只有两种状态,0和1,我们用1表示存在,0表示不存在,给n个数,这n个数会组成多少种状态: 答案很明显会有2^n个状态,这其实是高中时学的组合数学,每个位置有2种可能,则n个位置有2^n种可能。2^n个状态代表总状态量举个栗子:假如果有5个数,我们要把它的所有状态枚举出来,它的所有状态是32种状态,现在我把代码写下来,...原创 2019-12-02 10:38:44 · 516 阅读 · 0 评论 -
组合数爆long long问题
如果以组合数的变化公式C(x,y)=x!/y!这样写,在数据范围大于15左右就会爆掉long long,所以需要处理一下组合数公式的组合方式:C(x,y)=x/1*(x-1)/2*…(x-y+1)/y这样可以让组合数乘的时候小一点(原理:x逐渐递减而且有序,而且符合奇偶交替,y从1逐渐递增且有序,也符合奇偶交题所以可以这样实现代码实现:long long C(ll m,ll n){ll ...原创 2019-12-02 11:07:51 · 842 阅读 · 0 评论 -
神考四题题解+记忆化操作:
这四题用递归写法:数据量40--50可能就跑不动了所以这里涉及一个记忆化的小技巧因为递归是一直递归到最后的结束条件,所以有些不用递归到最后就可以结束了,比如我们要求6的阶乘,第一次求了6的阶乘,我们再准备求3的阶乘的时候,其实已经不用求了,因为在求6的阶乘的时候已经把3的阶乘求过了看一下代码理解一下:#include<bits/stdc++.h>using nam...原创 2019-11-11 21:25:01 · 143 阅读 · 0 评论 -
递归讲解
前言人理解迭代,神理解递归。递归这种思想要好好理解首先讲解递:递的含义就是传递,传递到结束再讲解归:归的含义就是回归,当结束后要回归理解上面的递和归后,我们再来学习结束条件:在讲递的时候,我们提到了传递到结束,这里的结束就是结束条件现在我们来举个栗子:我们要用递归去求阶乘int get_smul(int n){ if(n==1) re...原创 2019-11-11 19:57:44 · 399 阅读 · 0 评论 -
小白回顾------并查集讲解
Part I:先了解并查集1:并查集:并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题。主要有以下三种操作:(1)初始化:把每个点所在集合初始化为其自身。(2)查找:查找两个元素,即找祖宗。注意:查找时,采用递归的方法找其祖宗,祖宗集合号等于自己时即停止。在回归时,把当前结点到祖宗路径上的所有结点统一为祖宗的集合号。(3)合并:如果两个元素的集合号不同将两个元素合并为一...原创 2019-07-19 11:30:54 · 306 阅读 · 0 评论 -
小白回顾------最小生成树(Kruskal)
Part I:(1)最小生成树:在无向连通带权图中,找到权值最小的,连通所有点的非负权线路(2)Kruskal涉及思想算法:贪心思想,并查集算法(3) 令G=(V,E):G代表无向连通带权图,V为所有顶点,E代表所有边(4)假设V=7则:图1:(5)解释负权:负权即形成回路,图2:Part I I:讲解算法思路:(1)目的:我们要得到所有点的连通路线,则这条线路必定有n...原创 2019-07-20 10:03:40 · 217 阅读 · 0 评论 -
小白回顾(Dijkstra+spfa+链式前向星)
笔记摘抄废话:不得不感叹链式前向星的强大,昨天下了点功夫学会了拓扑排序,理解了head[]和next的神奇用法后,没想到今天写专题遇到邻接矩阵无法建图的情况,就学了一下之前一直觉得没有用的spfa(),这一学收获颇多!!!SPFA 算法详解(最短路径)算法优点:1:时间复杂度比普通的Dijkstra和ford低2:能够计算负权图问题3:能够判断是否存在负环(即:每跑一圈,路径会减少,...原创 2019-08-23 11:27:45 · 244 阅读 · 0 评论 -
dp求最长单调递减序列
一道线性dp,和前天写的是一样的,今天准备在学一学二分写法AC代码:#include<bits/stdc++.h>using namespace std;//最大单调递减序列#define maxn 1005int dp[maxn];int a[maxn];int n;void slove_dp(){ for(int i=1;i<=n;i++) ...原创 2019-10-28 19:39:35 · 130 阅读 · 0 评论 -
考虑状态的dp(最长单调递增子序列)
题目:题解:以ababc为例:j/i/dp[i]ababca1b12a121b1212c12123这就是这个表格的图,因为某个点都可能为起点,所以每个点的最开始的状态为1,以这个点往后更新if(s[i]>s[j]){ dp[i]=max(dp[i],dp[j]+1);...原创 2019-10-26 20:49:10 · 110 阅读 · 0 评论 -
线性dp: 最长公共子序列
题:题解:一开始我画了一个表格,当我画了表格之后把数据带入,发现了一个规律if (s1[i]!=s2[i]) {dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}//保持当前状态的最优状态else{dp[i][j]=dp[i-1][j-1]+1;}//同一层状态会影响到之前的状态wa代码:#include<bits/stdc++.h>...原创 2019-10-26 19:10:34 · 186 阅读 · 0 评论 -
kmp算法详解
kmp算法是一个高效的匹配算法对于数据量小的字符串s和p,我们可以写暴力匹配去达到要求,但数据量很大的话,效率就会很低。这里我先讲一下暴力匹配的写法,因为高效的kmp算法和暴力匹配算法有很大关联首先给一个字符串s[ ]:"ababaaacd",再给一个匹配的字符串p[ ]:"abaa" 如果我们想要写一个程序,让程序告诉我们s串中是否含有p串思路很简单:1:ababaaacdaba...原创 2019-11-05 18:48:56 · 289 阅读 · 0 评论 -
龟速乘法取模,避免爆掉
题目链接题目描述: 给两个数a,b(0<=a,b<=1e18),求a*b%modmod=1e18+7显然a*b的最大范围会爆掉long long 这里用将乘法快速转加法的,快速方法#define ll long long#define mod 1000000000000000000+7ll quick_mod(ll a, ll b,ll c) //模拟a*b%mod{...原创 2019-11-03 18:56:10 · 457 阅读 · 0 评论 -
Linux的学习笔记
一: Linux 系统的文件1.文件与文件夹什么是文件?文件一般都是独立的个体,可以用特定的工具打开,是存储在长期储存设备或临时储存设备的一段数据流,并归属于计算机文件系统的管理之下。例如:什么是文件夹?文件夹是协助人们管理计算机文件的,每一个文件夹对应一块磁盘空间为什么先将文件?1:日常运维工作中,大部分的是见都是对文件的操作2:Linux 是基于文件形式存在的操作系统3:...原创 2019-10-31 21:39:38 · 127 阅读 · 0 评论 -
2019级ACM第一次招新赛题解:
A:我是签到题说是签到题,其实有点思路,这道题爆了long long,所以需要用char s[] ,len=strlen(s)和需要删除n个数92081346718538 10以这个样例为例:9 2 0 8 1 3 4 6 7 1 8 5 3 8 from[0,10]查找max=9 id=0 id++=1 n++=11from[1,11]查找max=8 id=3 id++=4 n+...原创 2019-10-27 18:11:11 · 915 阅读 · 0 评论 -
spfa记录最短路径
写一个Spfa()记录最短路路径,我们只需要一个辅助的数组link[ ]即可例题:ac代码:#include<bits/stdc++.h>using namespace std;#define maxn 10005#define judge 0x3f3f3f3fstruct node{ int u,v,w;} temp;int n,m;vector&...原创 2019-10-25 17:07:56 · 389 阅读 · 0 评论 -
数状数组(入门)
数组数组学习数组数组的好处:树状数组相对于线段树的编码来讲,树状数组的编码并不复杂,反而很简单,对于一些区间求和,区间求最大值,维护区间的问题,反而能更简单的解决树状数组核心代码:int lowbit(int i)//lowbit()可以寻找树状数组中的前向位置和后向位置{ return i&(-i); }例如要更改一个区间当中的和void update(int ...原创 2019-10-21 20:21:57 · 433 阅读 · 0 评论 -
网络流(最大流入门)
网络流之最大流算法入门网络流算法基于增广路算法:我们可知由源点S--->汇点T有多条路径,增广路算法便是找每一条S--->T的路,进行操作,对网络流进行更新,当所有路找完后,得到最大流。最大流之bfs()进行分层:利用bfs()对S--->T的每一个节点进行分层,可以提高算法的效率代码:#include<bits/stdc++.h>using names...原创 2019-10-17 18:41:32 · 146 阅读 · 0 评论 -
连通图(求连通分量)
连通图中的连通分量个数求法:可以根据最早时间戳和辅助时间戳low[]和dfn[]#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;#define maxn 1005int dfn[maxn],low[maxn]...原创 2019-10-15 20:40:33 · 859 阅读 · 0 评论 -
连通图(求桥的数量)
桥:连通图中存在的必经之路,我们成为桥,如果把此路断开,连通图便会变成两个图判断是否是桥的方式(low[v]>dfn[u])题目链接AC代码:#include<bits/stdc++.h>using namespace std;//桥#define maxn 10005struct node{ int a,b;//代表两个端点} temp[maxn]...原创 2019-10-15 10:37:00 · 581 阅读 · 0 评论 -
单源最短路:SPFA算法细讲
SPFA算法是解决最短路问题的算法今天来回顾一下单源最短路的问题:利用SPFA算法可以高效的解决单源最短路问题,并且解决有无负环的问题如该无向图所示:假设我们的单源点是1Part:我们从1...原创 2019-10-14 20:29:30 · 211 阅读 · 0 评论 -
Hopcroft-Carp(有点难)
吐槽:本想把这个算法收藏在板子库里面,但学算法还是要理解的!!!理解起来真的不容易,这个算法的变量实在是太多了,看了很一天多的博客,用了六七草稿纸去模拟代码的过程,直到现在我其实还没有完全理解,但还是记录下来,慢慢回味!!!例题:题意:有n个人的信息(信息包括每个人的坐标和速度)和m把伞的位置,问在t时间内,最多能有几个人拿到伞题解:看到这题后,不就是裸的二分图匹配吗,确定人和伞的...原创 2019-09-17 21:32:47 · 337 阅读 · 0 评论 -
最小生成树(prim)讲解
prim吐槽:prim这个算法一开始我并不想去学习它,因为这个算法和krsual比起来真的没可比性,但是最近遇到一些题,用这个思路去解决更简单,索性我就学一下它讲解:首先我们定义一个colsest[ ]代表最邻近点举个栗子:第一行代表数组下标第二行代表下标下的值上表可以画成下图这样理解:这个图的含义便是最小生成树定义lowcost[ ]代表这个图的边权因为是连通的树形结构...原创 2019-09-10 10:44:22 · 453 阅读 · 0 评论 -
拓扑排序加深理解
拓扑排序**一:**定义对一个有向无环图(Directed Acyclic Graph 简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v>属于E(G),则u在线性序列中出现在v之前通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列注意:1)只有有向无环图才存在拓扑序列:2)对于一个DAG,可能存在多个拓扑序列HDU...原创 2019-09-08 17:50:04 · 96 阅读 · 0 评论 -
最短路vector建图多种方式实现最短路+toposort
吐槽:不停的学习对于理解是有好处的,刚学会链式前向星的时候,觉得前向星好方便呀,现在会了用vector后就不想去用前向星建图了,感觉有点麻烦,不过理解了前向星,能更好的理解vector的用法既然现在用vector建图,那必然要学会最短路的vector使用方法(堆优化)...原创 2019-09-07 21:15:13 · 728 阅读 · 0 评论 -
二分图匹配(小白讲解匈牙利算法)
Part one :先理解二分图:二分图其实就是在一个图中所有的点可以分为两组,同一组中没有边,所有的边都跨越了两个组。准确的说:把一个图的顶点划分为两个不想交的集合 U 和 V ,且使得每一条边都分别lial连接 U 、V 中的顶点,如果存在这样的划分,则称此图为二分图。此外二分图还有一个等价定义是:不含有「含奇数条边的环」的图。知道二分图的含义后我要来讲讲二分图匹配举个栗子理解上...原创 2019-09-05 19:58:56 · 239 阅读 · 0 评论 -
拓扑排序(快速理解)
拓扑排序简介:在一个有向图中,对所有节点进行排序,要求没有一个节点指向它前面的节点(无环形成)先统计所有结点的入度,对于入度为0的节点就可以分离出来,然后把这个结点指向的节点的入度减一一直做改操作,直到所有节点都被分离出来如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况下面是算法的演示过程。讲解:首先要理解拓扑排序,需要先理解入度入度:...原创 2019-08-21 10:35:08 · 478 阅读 · 0 评论 -
小白回顾------矩阵快速幂讲解
为快速求a^b,我们可以采用折半的思想:1:当b为偶数时,a^b = = (a^2)^b/22:当b为奇数时,a^b = =a*(a^2)^b/2代码:int quick_mi(int a,int b){ int ans=1; while(b) { if(b&1)//奇数隔单,位运算更快,其实还可以写为,b%2==1 {...原创 2019-07-18 14:40:44 · 363 阅读 · 0 评论