自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 最短路(Dijkstra + 优先队列优化)

堆优化堆优化的主要思想就是使用一个优先队列(就是每次弹出的元素一定是整个队列中最小的元素)来代替最近距离的查找,用邻接表代替邻接矩阵,这样可以大幅度节约时间开销。在这里有几个细节需要处理:首先来讲,优先队列的数据类型应该是怎样的呢?我们知道优先队列应该用于快速寻找距离最近的点。由于优先队列只是将最小的那个元素排在前面,因此我们应该定义一种数据类型,使得它包含该节点的编号以及该节点当前与...

2018-11-18 19:55:12 502

原创 Linux系统级程序设计-3

1 wait函数#include <sys/wait.h>pid_t wait(int *status);功能:挂起进程,进程进入阻塞状态,直到子进程变为僵尸态,如果捕获到子进程的退出信息就会转为运行态,然后回收子进程资源并返回;若没有变为僵尸态的子进程,wait函数就会让进程一直阻塞。若当前进程有多个子进程,只要捕获到一个变为僵尸态的子进程,wait函数就会恢复执行态。参数说明:参数status是一个int *类型的指针,用来保存子进程退出时的状态信息。通常情况下该参数设为N

2022-05-11 22:51:54 173

原创 Linux系统级程序设计-2

文件操作函数1.stat函数用于获取文件属性,包括文件的文件名、文件大小、文件类型等等#include <sys/stat.h>int stat(const char *path, struct stat *buf);参数path为文件的路径(同目录下为文件名);参数buf即接受文件所拥有的属性。2.access()用于测试文件的某些权限是否存在#include <unistd.h>int access(const char *pathname,

2022-05-07 15:30:04 146

原创 Linux 系统级程序设计-1

1 文件I/Oopen()read()write()lseek()close()1.1 open函数#include <fcntl.h>int open(const char *pathname, int flags[, mode_t mode);12open函数参数说明:pathname:待打开文件的文件路径名;flags:访问模式,常用的宏有:– O_RDONLY:只读– O_WRONLY: 只写– O_RDWR: 读写– O_CREAT: 创建一个文

2022-05-04 01:15:20 148

原创 结构体存有权图

#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;vector&gt;using namespace std;struct node{ int to; int val;};vector&lt;node&gt; vec[100005];int main(){ int n, m, a, b,c; cin &gt...

2018-11-18 20:08:25 339

原创 并查集

#include&lt;iostream&gt;#include&lt;cstdio&gt;using namespace std;int f[10005]; inline int find(int x){ if(x != f[x]) f[x] = find(f[x]); return f[x];}//路径压缩void join(int a, int b){ if(fi...

2018-11-18 20:08:16 134

原创 最短路及最短路计数(SPFA)

#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;algorithm&gt;#include &lt;vector&gt;#include &lt;queue&gt;using namespace std;#define M 10005#define INF 8...

2018-11-18 20:08:05 740 2

原创 最小生成树(Kruskal)

#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;using namespace std;int flag = 0;struct Edge{ int u,v,w;}edge[200005];struct Node{ int to,val;}...

2018-11-18 20:07:54 148

原创 组合数模板C(m,n)

#include&lt;iostream&gt;#include&lt;cstdio&gt;using namespace std;long long C[2018][2018];int main(){ int k,n; cin &gt;&gt; k &gt;&gt; n; C[0][0] = 1; for (int i = 1; i &lt;= n; ++i) { ...

2018-11-18 20:07:45 175

原创 运算符重载C++ (Operator)

下面来进行这段代码的分析:struct node {  //定义一个结构体node(节点)   int x;   int y;   int len;   //node中有3个成员变量x,y,len   bool operator &lt;(const node &amp;a)const {//重载&lt;操作符。可以对两个node使用&lt;操作符进行比较       r...

2018-11-18 20:07:34 296

转载 动态规划 最长公共子序列(LCS) 过程图解

1.基本概念      首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:       如上图,给...

2018-11-18 20:07:25 3702 4

转载 二分图匹配(匈牙利算法)

二分图匹配,自然要先从定义入手,那么二分图是什么呢?二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图...

2018-11-18 20:05:52 219

转载 无向图的割点

图的割点在一个无向连通图中,如果删除某个顶点后,图不再连通(即任意两点之间不能相互到达),我们称这样的顶点为割点(或者称割顶)。上图中的2号顶点就是割点,因为删除2号后,4,5不通,1,6也不通。 很容易想到的方法是:依次删除每一个顶点,然后用dfs或者bfs来检查图是否依然连通。如果删除某个顶点后,导致图不再连通,那么刚才删除的顶点就是割点。这种方法的时间复杂度是O(N(...

2018-11-18 20:04:45 1016

转载 双向BFS模板

如果已经知道搜索的开始状态和结束状态, 要找一个满足某种条件的一条路径(一般是最短路径),为了避免无谓的“组合爆炸”产生,就可以采取双向广度搜索算法,也就是从开始状态和结束状态同时开始搜索,一个向前搜,一个向后找。 这样做的好处是什么? 我们不妨假设每次搜索的分支因子是r,如果最短的路径长为L的话(也就是搜了L层),那么,用一般的BFS算法(不考虑去掉重复状态),总的搜索状态数是r^L(^表示乘方...

2018-11-18 20:04:34 1467 1

转载 取模运算性质

定义给定一个正整数p,任意一个整数n,一定存在等式 :n = kp + r ;其中 k、r 是整数,且 0 ≤ r &lt; p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。对于正整数 p 和整数 a,b,定义如下运算:取模运算:a % p(或a mod p),表示a除以p的余数。模p加法: ,其结果是a+b算术和除以p的余数。模p减法: ,其结果是...

2018-11-18 20:04:21 459

转载 二分图判断

二分图又称为二部图,其定义是:设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。也就是说在二分图中,顶点可以分为两个集合X和Y,每一条边的两个顶点都分别位于X和Y集合中。它满足这样一个特性,即有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边相连接!如下图所示:无向图G为二分图的充...

2018-11-18 20:04:11 1129

原创 字符串哈希(进制哈希)

哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能高概率重复(就像不能让隔壁老王轻易地用它家的钥匙打开你家门一样qwq),通过这种方式来替代一些很费时间的操作。比如,最常见的,当然就是通过哈希数组来判断几个串是否相同(洛谷p3370)。此处的操作呢,很简单,就是对于每个串,我们通过一个固定的转换方式,将相同的串使其的“密”一定相同,不同的串 尽量 不同。此处有人指出:...

2018-11-18 20:04:01 1392 1

原创 求连通块(并查集实现)

        连通块可以理解为无向图中有几个连通的点集,那么这个过程与并查集的原理就极其相似了,将点集看作并查集的祖先和他的后代们,相互连通的点就放在同一祖先下,这样只需要查找共有几个祖先即可。下面来一道例题深入理解下:[JSOI2008]星球大战当我们加入一个点时,先假设又加入一个单独的连通块,然后再扫一下与它相连的点如果在图中但是与它不在一个连通块中,那么就将其合并,连通块个数减一。...

2018-11-18 20:03:52 1864

原创 next_permutation VS prev_permutation(序列的全排列)

C++ STL大法好!!! #include&lt;iostream&gt;#include&lt;algorithm&gt;using namespace std;int main(){ int a[4]={1,2,3,4}; next_permutation(a,a+4); cout&lt;&lt;a[0]&lt;&lt;" "&lt;&lt;a[1]&lt;&lt

2018-11-18 20:03:45 149

原创 优先队列用法详解

在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问。即优先队列具有最高级先出的行为特征。优先队列在头文件#include &lt;queue&gt;中;其声明格式为:priority_queue &lt;int&gt; ans;//声明一个名为ans的整形的优先队列基本操作有:empty( )  //判断一个队列是否为空pop( )  //删除队顶元素...

2018-11-18 20:03:30 831

原创 记忆化搜索

记忆化搜索(Memory search)是指搜索信息的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重...

2018-11-18 20:02:59 184

转载 树上差分(点差分与边差分)

矩阵的差分应该很简单,典型题目是这样的:给你一堆数,有n次修改操作,每次给i..j这个区间加上x。最后问所有数中最大的那个。差分,通俗一点就是把区间的操作改为点操作,在点上记录变化量。上题只需记录dlt[i]+=x,dlt[j+1]-=x,最后用前缀和扫一遍即可。树上差分,顾名思义就是在树上搞差分。有两种典型题型,一种是边差分,一种是点差分。边差分给你一棵树,有n次修改操作...

2018-11-18 20:02:46 3043 1

转载 lower_bound VS upper_bound(用法详解)

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。在从小到大的排序数组中,lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。upper_...

2018-11-18 20:02:36 290

原创 LIS(最长上升子序列)nlogn求法

思想:贪心+二分新建一个low数组,low[i]表示长度为i的LIS结尾元素的最小值。对于一个上升子序列,显然其结尾元素越小,越有利于在后面接其他的元素,也就越可能变得更长。因此,我们只需要维护low数组,对于每一个a[i],如果a[i] &gt; low[当前最长的LIS长度],就把a[i]接到当前最长的LIS后面,即low[++当前最长的LIS长度]=a[i]。 那么,怎么维护low数组...

2018-11-18 20:02:24 391

转载 LCA - Lowest Common Ancestor(倍增求法)

倍增的思想是二进制。首先开一个n×logn的数组,比如fa[n][logn],其中fa[i][j]表示i节点的第2^j个父亲是谁。然后,我们会发现有这么一个性质:                       fa[i][j]=fa[fa[i][j-1]][j-1]用文字叙述为:i的第2^j个父亲 是i的第2^(j-1)个父亲的第2^(j-1)个父亲。这是不是很神奇?这样,本来我们...

2018-11-18 20:02:14 149

原创 进制转换

#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt;using namespace std;const int maxn=1e5+5;typedef long long LL;char n[maxn];LL sum = 0;void turn_10_to_k(int n,int k) {//将十...

2018-11-18 20:02:02 90

原创 区间动态规划

        区间动态规划,又称合并类动态规划,顾名思义,区间动态规划的题目一般来说是在操作每一个区间,(例如将两堆石子合并在一起,获得的价值是两堆石子的总价值)并获得相应的价值。当然,与线形动态规划有所不同的是,它要操作的子区间是要选择最优的。这时,我们就不能套用类似于线形动态规划的方程了,于是,便引出了区间动态规划。区间动态规划有属于自己的一类方程:for(int t = 1; t...

2018-11-18 20:01:08 267

原创 归并排序与逆序对

最近学习逆序对,发现竟然要学习归并排序,于是只好学了一下(之前一直用C++ STL的sort函数),发现思想和线段树竟然惊人的相似,先放一张图你们就懂了:怎么样,是不是发现这就是一棵线段树!其实归并排序利用了二分的思想,即分而治之。归并排序归并排序是一种稳定的方法, 时间复杂度:O(nlogn),空间复杂度:O(n) 是不是很优秀啊,现在我们就来讲解一下算法的流程:voi...

2018-11-18 20:00:52 158

原创 离散化

数据的离散化有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。例如:91054与52143的逆序对个数相同。设有4个数:1234567、123456789、12345678、123456排序:123456&lt;1234567&l...

2018-11-18 20:00:39 98

原创 组合数取模(费马小定理)

费马小定理:    (p为质数) 我们由此可以推出:(m是质数)所以a在mod m 意义下的逆元等价于a^m-2,这样我们就会求一个数的逆元了。注意:费马小定理只能在a,m互质时使用!这里我们会想可不可以直接带公式求解呢?因为涉及到除法的取模,所以要用到逆元求解,自然想到使用费马小定理来求一个数的逆元思路 这样我们就可以快速的求出组合数取模后的结...

2018-11-18 20:00:30 493

原创 SPFA判断负环

先放一张图加深理解负环所谓负环,即权值之和为负值的环此图中执行SPFA会进入负环的死循环(每次加边后都比原来值小)故应cnt[ ]记录下每个点遍历次数若大于总点数,则存在负环例题 :洛谷—负环模板 #include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include ...

2018-11-18 20:00:21 193

原创 二分答案

定义:二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。1.查找值在一个有序的数组中查找一个值。 因为有序,所以可以二分。 大致是这样的:取出中间的数,如果大于要查找的值,答案就在左边,否则在右边。这样每次查找都可以把范围缩小一半。所以时间复杂度就是O(log n)了。代码如下:int LB(int A[],int n,int x){ int...

2018-11-18 20:00:10 275

原创 floyd改进版求最小环

最小环改进算法的证明设一个环中的最大结点为k(编号最大), 与他相连的两个点为i, j, 这个环的最短长度为g[i][k]+g[k][j]+i到j的路径中所有结点编号都小于k的最短路径长度。根据floyd的原理, 在最外层循环做了k-1次之后, dist[i][j]则代表了i到j的路径中所有结点编号都小于k的最短路径综上所述,该算法一定能找到图中最小环。先上模板:#include&...

2018-11-18 19:58:33 751

原创 拓扑排序

一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。例...

2018-11-18 19:58:24 412

转载 使序列有序的最少交换次数

题目1:给出一个序列,只交换相邻两数,使得序列升序排列,求出最少交换次数。思路:如果说只是交换相邻两个数字。那么最小交换次数就是这个序列的逆序数。假设序列个数为n,我们先把最大的数换到最后,因为是相邻数字交换,所以把最大数交换到最后,需要交换的次数为最大数后的数字个数。 当完成最大数的交换后,可以将最大数从序列中划去不管了,即此时序列个数为n-1了,我们再在该序列中找到一个最大数...

2018-11-18 19:58:00 4332 1

原创 线性素数筛

#include &lt;iostream&gt;#include&lt;cstdio&gt;using namespace std;#define MAX_N 10000005int prime[MAX_N + 5] = {0};//判断是否为素数的表(0表示素数,1表示不是素数)int n_prime [MAX_N + 5] = {0};//素数表void init_prim...

2018-11-18 19:57:49 104

原创 快速幂模板

分治思想时间复杂度为logb次ll fast_pow(ll a, ll b, ll mod){ ll ans = 1;//答案初始化为1 a = a % mod;//乘法取模运算性质 while(b &gt; 0){ if(b &amp; 1)//b是奇数,被2整除不了,还需要再乘a的一次幂 ans = ((long lon...

2018-11-18 19:56:54 127

原创 表达式求值(stack实现)

题目链接:表达式求值模板:#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cstring&gt;#include&lt;stack&gt;using namespace std;char line[5000005];long long ans,x,y;s...

2018-11-18 19:56:41 266

原创 线段树

查询给定区间的最值每次查询复杂度O(1) #include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt;using namespace std;const int MAX_N = 100010;int minn[4 * MAX_N];int ans[MAX_N];int n,m;inline vo...

2018-11-18 19:56:38 108

转载 Manacher算法(最长回文子串)

Manacher算法Manacher算法的应用范围狭窄,但是它的思想和拓展kmp算法有很多共通支出,所以在这里介绍一下。Manacher算法是查找一个字符串的最长回文子串的线性算法。在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个。计算字符串...

2018-11-18 19:56:35 590 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除