摘要: 图的存储方式有邻接矩阵和邻接链表。 邻接矩阵就是开一个二维数组来表示图上两个点之间的连边情况,比较简单,也有弊端,当图比较稀疏时,也就是边数相对少时,会造成大量的空间浪费。 邻接链表也并不复杂,但具体实现方式有很多,下面的代码只是其中一种,还可以使用二维vector,来保存与点相连的边。 阅读全文
posted @ 2018-08-18 20:02 Mr^Kevin 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 对于一个有序的序列,可以用二分查找的方式快速找到某一元素。顾名思义,二分查找就是利用二分的思想,通过将要查找的元素与区间中点值比较,大体确定元素位置,舍弃一半的元素,因此效率很高。 c++ STL库中提供了这类函数:lower_bound和upper_bound。其中lower_bound是返回有序 阅读全文
posted @ 2018-08-18 18:15 Mr^Kevin 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 对于一个无序的序列,找出其中第k大的数,你会怎么做呢?一个容易想到的做法是,先将原序列按降序排序,再输出第k个元素。这种做法是正确的,只不过在数据范围较大时不太适用,主要是因为排序算法一般选择快排之类的,复杂度是O(nlogn)。那么有没有更优秀的方法呢?是有的,而且思想和快排相似。不妨回忆一下快排 阅读全文
posted @ 2018-08-18 17:36 Mr^Kevin 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 归并排序体现了分治思想,时间复杂度是O(nlogn),空间复杂度是O(n)。 归并排序是将序列不断二分,最终分成单个元素,再两两合并,最终达到整个序列有序。 1 void msort(int l,int r) { 2 if(l==r) return; //划分到单个元素就返回 3 int m=l+( 阅读全文
posted @ 2018-08-18 16:08 Mr^Kevin 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 其实对于c++选手来说,快速排序即使没有掌握,也可以使用STL库中的sort函数。但仔细学习一下快速排序还是很有必要的,不光是由此演化的快速选择算法,快排的种种优化也可以锻炼能力。 快排的思想很简单,就是选取序列中任意一个元素为基准,将序列划分成两部分,序列左边都比基准小,右边都比基准大,也就是找到 阅读全文
posted @ 2018-08-18 11:20 Mr^Kevin 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 所谓高精度算法,就是把一个大整数的每一位分开储存,分开操作,从而避免溢出。在某些时候,数据可能会大到long long类型都会溢出,这时候就需要用到高精度算法了。其实,高精度算法是比较鸡肋的,很少单独考察,而且通常会被模运算替代,使用次数越来越少。但不排除有些题目就是要用到高精度,比如NOIP201 阅读全文
posted @ 2018-08-17 19:49 Mr^Kevin 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 单调队列是指在任意时刻,队列中的元素都是单调的(递增或递减),同时他又具有双端队列的部分性质(允许从队尾删除元素)。 在这里,有一道经典的例题:滑动窗口求最值 题目描述:在一个长度为n的整数序列上有一个长度为k的滑动窗口,求滑动窗口内的最(大/小)值。 解释:就是在一个序列上对于每个长度为k的区间, 阅读全文
posted @ 2018-07-27 13:22 Mr^Kevin 阅读(246) 评论(2) 推荐(1) 编辑
摘要: deque是c++ STL中提供的双端队列,即与普通队列相比,还支持在尾部弹出元素,在头部插入元素。 阅读全文
posted @ 2018-07-27 10:09 Mr^Kevin 阅读(212) 评论(1) 推荐(1) 编辑
摘要: 快速幂复杂度只有logn,比一般的n的算法要好得多,其实质就是枚举二进制位。 阅读全文
posted @ 2017-11-17 20:54 Mr^Kevin 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1017 进制转换大致可分为R进制转10进制和10进制转R进制。 一、R进制转10进制: 这个比较简单,可以直接套公式。 就是将R进制数转化为若干形如a*R^(i-1)的式子之和(a为R进制数当前位上的 阅读全文
posted @ 2017-08-26 11:20 Mr^Kevin 阅读(360) 评论(0) 推荐(1) 编辑