摘要:
传送门:https://www.luogu.com.cn/problem/CF817D 对于给定由 n 个元素构成的数组。一个子数组的不平衡值是这个区间的最大值与最小值的差值。数组的不平衡值是它所有子数组的不平衡值的总和。 以下是数组[1,4,1]不平衡值为9的例子,共有6个子序列: [1] (从第 阅读全文
摘要:
堆 世界上目前有很多种堆,比如二叉堆、斐波那契堆、配对堆、左 偏树等等,不过由于各种原因,OI里面提到的堆都是二叉堆,也 就是下面要讲的。下文的堆都是指的二叉堆。堆可以在单次严格O(logn)的时间复杂度内 插入一个数字、删除最大/小的数字,并严格O(1)询问最大/小的数字、 看起来,堆能做的事情非 阅读全文
摘要:
最小生成树的基础算法比最短路的简单114514倍 前面说了一个适用于稠密图的算法,这次来说一说一个适用于稀疏图的最小生成树算法——Kruskal算法,老土话叫克鲁斯卡尔算法。 同样,它的实现也很简单,还是经典三步: 1、将所有边按从小到大顺序排序(啊哈哈,终于不是初始化了)。 2、枚举每条边,设a已 阅读全文
摘要:
最小生成树与最短路比较相像,解决的问题也比较相像,尤其是今天说的Prim算法,它和Dijkstra十分相似。 Prim比较简单,这篇会用最简洁的语言概括到它的精髓,简洁易懂。 重要的事情说三遍:Prim算法适用于稠密图。 重要的事情说三遍:Prim算法适用于稠密图。 重要的事情说三遍:Prim算法适 阅读全文
摘要:
堆优化Dijkstra就是基于朴素Dijkstra的优化,在朴素Dijkstra中是枚举两层点,在堆优化中,首先枚举边,再查找点。 假设图中有n个节点,m条边。 点是存储在一颗二叉树(堆)里的,所以查找的时间复杂度是O(log2n),那么它总的时间复杂度就是O(m*log2n)。 堆优化Dijkst 阅读全文
摘要:
在这篇里,我们讲到,对于有负权值的情况下,一般用Bellman_Ford。 今天就来详述一下Bellman_Ford与其例题。 Bellman_Ford的思想非常简单,首先第一层枚举点,第二层枚举每一条边。 与其说第一层是枚举,其实不如说它是单纯循环,因为,有些题目中,第一层就是单纯循环,对于需要枚 阅读全文
摘要:
Part1:最短路基础 对于最短路问题,常见的有5种算法:朴素Dijkstra,堆优化Dijkstra,Bellman_Ford,SPFA,Floyd。 注:堆优化Dijkstra虽然有这样的名字,但它和朴素Dijkstra的差别还是蛮大的,或者可以说,堆优化Dijkstra是基于朴素Dijkstr 阅读全文
摘要:
讲背包之前,我先说一下DP。 DP即动态规划,它的根本是暴力,但是是有思想的暴力,而实现方式是递推,DP大部分是逆推,作为我的“本命算法”,是非常简单的。 前面说到,DP是有思想的暴力,暴力有手就行,所以DP的重点就在这个思想上,DP的思想可以分为两部分: 第一部分是状态的表示,DP是一定要用一个数 阅读全文
摘要:
Hash是一种离数散算法,译名为哈希,它的基础概念就是映射,把数据按一定方式分类,存到一个数组里。如数组a[]{1,4,5,2,6,8,11},把这个a[i]存到Hash[a[i]^3%10],就是一种哈希,它的Hash存储方式就是a[i]^3%10。 有人挺Hash,但有人不建议用Hash,这还得 阅读全文
摘要:
前言:本篇用了我比较长的时间,干货较多,甚至一篇顶三篇,希望各位耐心观看。 Part 1:单调栈 单调栈是一种数据结构,一般分为单调递增栈和单调递减栈。单调栈一般用来解决寻找下一个大于或小于m的值。 我们把得到的答案放到K数组里。 一个经典例题:定义函数 f(i)代表数列中第i个元素之后第一个大于a 阅读全文
摘要:
这篇有一些水,主要普通Dijkstra,及朴素迪克斯特拉算法,简称普迪。迪克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。在图论中称作最短路。 普迪的思路是:有两个数组,d[]和s[]。d数组表示从起点到终点的最小数值。s数组表示当前位置有没有确定,在100%确定当 阅读全文