摘要:朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn);dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似。 朴素dijk: 1 int dist[maxn];//距离 2 int g[maxn][maxn];/ 阅读全文
posted @ 2020-02-27 22:27 时侍 阅读(47) 评论(0) 推荐(0) 编辑
摘要:在存图的时候,如果用二维矩阵存图容易爆内存,做算法题一般会使用vector<int> v[maxn]或者链式前向星。使用vector很容易理解,这里记录一下链式前向星的写法。 首先一个head数组为每个结点的头部,并且设置一个计数器(用处下文解释) int head[maxn]; int cnt; 阅读全文
posted @ 2019-12-06 17:37 时侍 阅读(28) 评论(0) 推荐(0) 编辑
摘要:问题描述: 给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? 输入格式: 第一行给出n,m,表示有n个数分成m段,随后一行给出n个数,以空格分隔 输入样例: 9 3 9 8 7 6 5 4 3 2 1 输出样例: 阅读全文
posted @ 2019-10-31 09:55 时侍 阅读(161) 评论(0) 推荐(0) 编辑
摘要:树状数组,基于二进制实现快速求前缀和以及修改数组元素。 必要工具:lowbit(x):取x二进制中最后一位1代表的数; #define lowbit(x) (x & -x) 1.在原数组上建立树状数组 单点修改 add(x,val):使x结点及其所有父节点数值增加val 1 void add(int 阅读全文
posted @ 2019-10-19 21:33 时侍 阅读(15) 评论(0) 推荐(0) 编辑
摘要:上周在牛客做了一道快速幂的题,今天整理一下,参考了睛神的《算法笔记》。 一、用处: 给定三个正整数a,b,m,计算$a^b%p$,时间复杂度O(logb); 二、原理: 形如$a^b$, 1.若b为偶数,可分解为$a^{\frac{b}{2}}*a^{\frac{b}{2}}$ 或 $(a^{2}) 阅读全文
posted @ 2019-09-06 12:59 时侍 阅读(47) 评论(0) 推荐(0) 编辑