摘要:
拓扑排序 • 拓扑图,就是一张有向联通无环图 • 拓扑序就是一张有向图遍历的点的顺序. • 拓扑排序就是考虑这个有向无环连通图中,有一条边(x,y),当选了x点之后才能 选y点,那么在拓扑序中x点一定要在y点之前. • 具体求拓扑序的方法就是每次在图中找到入度为0的点,加入到队列中,同时不 断地扩展 阅读全文
摘要:
线性DP 线性模型 例题: poj3486 Computers 你要保证 n 年中你都有一台电脑,一开始你有一台。 如果在第 y (1 <=y<=n) 年购买了一台,则需要花费 c 的代价。 如果这台电脑用到了第 z 年,在第 z 年又买了一台,你需要支付 m(y,z) 的维 修费用。 给定 n, 阅读全文
摘要:
哈希与哈希表 • 使用一个哈希函数将某个特定的数字变成另一个数字,这种操作称之为hash。 • 通常我们会以取模运算来作为哈希函数。 • 举例: hash(key)=key%23, 这样数组 [1 ,75,324] -> [1 ,6,2] • 如果哈希后得到的值相同,我们则可用该值建一个链表,把相同 阅读全文
摘要:
定义: 基本框架 int dfs(int u) // 保证进入dfs为有效且未访问状态,在进入dfs之后标记 { st[u] = true; // 标记 for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j) 阅读全文
摘要:
可持久化线段树 概念:可持久化线段树又被称为主席树。可持久化是指更新的同时保留了历史版本,可以获得所有的历史版本。本质上是多棵线段树,不过这些线段树共同使用了一部分枝干。 实现:可持久化线段树和线段树的实现有很大差别。线段树的 left和right表示区间的左右边界,而可持久化线段树的left和ri 阅读全文
摘要:
堆 定义:堆(Heap)是计算机科学中一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆分为大根堆和小根堆(从小到大用大根堆,从大到小用小根堆) 堆排序: 1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素; 阅读全文
摘要:
倍增 ●所谓倍增,就是把一个数据规模为n的问题分解成若干个2^ai的和,预处理数据范围内所有2^ai 的情况,再将这些规模为2^ai 的问题通过一定的方法合并,得出原问题的解。 ●分治是把整个问题分成几个互不重复的子问题,合并求解;倍增是找互为倍数关系的子问题之间的联系,再合并求解。 ●可以认为,倍 阅读全文
摘要:
分治/二分 ●分治/二分算法本质上都是采用了“分而治之”的思想,因此放在一起来讲。 ●所谓分而治之,即把一个大的问题转化成一个、两个或多个小的问题之和。 P1908 逆序对 #include <iostream> #include <cstdio> #include <queue> using na 阅读全文
摘要:
STL 在OI里面最常用的几个容器: stack,queue,deque,priority_queue,vector,set,map stack, queue, deque ●分别是栈、队列、双端队列。 ●双端队列的入队和出队操作在两端都可进行。 ●据说双端队列常数不小,建议少用。 priority 阅读全文
摘要:
前缀和 *一维 定义:一维前缀和S[i]表示的就是a[1]+a[2]+…+a[i]。 作用:求a[i]~a[j]的和 例如:有一列数字{a},多次询问一个区间[L,R]的和。n,m<=1000000。n 做法很简单,令s[p]=s[p-1]+a[p]=a[1]+a[2]+…+a[p],那么: a[L 阅读全文