数据结构
文章平均质量分 63
=
uadsbkc
这个作者很懒,什么都没留下…
展开
-
离散/链式前向星/Dij堆优化/
离散化 当题目数据的范围特别大的时候,10000000000000,不能作为数组的下标保存或者进行运算,当数据之间的关系只与他们的相对大小有关时(比如排序),就可以进行离散化操作 1.实现方式 struct Node { int x; //原始数值 int num; //原始下标 }a[MAXX]; 对数组a中的x按大小排序,把之后的顺序映射到b数组里,用新的下标代替原来的值 for(int i=1;i<=N;i++) b[a[i].num] = i; 2.重复元原创 2021-03-22 22:42:08 · 102 阅读 · 0 评论 -
前缀和/树状数组(一维+二维)/差分
前缀和 一维:就是数组y是数组x前面所有数字的和 概念 前缀和在更新的时候,对应的数字都要更新,十分复杂,所以引入树状数组。还是之前那个数组,只不过元素之间的逻辑关系不是直线,而是树的样子 特点: c的项数 == 数字二进制最低位1所代表的数字 // 求最低位1方法 int lowbit(x) //简单写法,还有一种复杂一点的,不管~ { return x & -x ; } 更新操作 查询操作 题目 1.敌兵布阵 ...原创 2021-03-18 18:29:17 · 234 阅读 · 0 评论 -
线段树
概念 用来维护区间信息的数据结构,可以在O(logN)O(logN)O(logN)的时间复杂度内,实现单点修改,区间修改,区间查询等操作 1.线段树的建立 数组[1,2,3,4,5]的线段树 //递归进行 void build(int l, int r, int p) //对[l,r]区间建立线段树,当前根的编号为p { if (l == r) // 到达叶子节点 tree[p] = a[l]; // 用数组中的数据赋值 else { int mi原创 2021-03-04 21:39:45 · 68 阅读 · 1 评论 -
并查集
概念 主要用于解决元素分组的问题,主要有两种操作: 合并(Union):把两个不相交的集合合并为一个集合 查询(Find):查询两个元素是否在同一个集合中 过程 1.初始化 int fa[MAXN]; //储存父节点 inline void init(int n) { for (int i = 1; i <= n; ++i) fa[i] = i; //一开始每个元素的父节点为自己 } 2.查询 路径压缩:把每个节点的父节点都设置为根节点 int find(int x原创 2021-03-03 10:04:58 · 41 阅读 · 0 评论 -
队列
优先队列 特点 放在优先队列里的元素按照优先级排列,优先级最高的先出 定义 priority_queue<Type, Container, Functional> Type:数据类型 Container:容器类型,如vector(默认),dequeue,不能是list Functional:比较方式 //升序队列,小顶堆 priority_queue <int,vector<int>,greater<int>> q; //降序队列,大顶堆 priority原创 2021-03-01 17:03:40 · 45 阅读 · 0 评论