434 字
2 分钟
4-1数据结构
数据结构
~目录
Part 7.1 链表 Part 7.2 栈 Part 7.3 队列 Part 7.4 并查集 Part 7.5 二叉堆 Part 7.6 ST表 Part 7.7 树状数组
Part 7.1 链表
Part 7.2 栈
单调栈
Part 7.3 队列
单调队列
Part 7.4 并查集
普通板子封装(联通大小(点,边),判断环)
struct DSU{ ve<int>fa,p,e,f; DSU(int n) { fa.resize(n + 1); iota(fa.begin(), fa.end(), 0); p.resize(n + 1, 1); e.resize(n + 1); f.resize(n + 1); } int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } bool merge(int x, int y) {//y-->x if (x == y) f[find(x)] = 1; //之前已经在一个地方了 x=find(x);y=find(y); e[x]++;//y-->x 边 if (x == y) return false; if (x < y) swap(x, y); // 将编号小的合并到大的上 fa[y] = x; f[x] |= f[y];//判断自环 p[x] += p[y];//点 e[x] += e[y];//边 return true; }
bool same(int x, int y) //判断是否在一个联通中 { return find(x)==find(y); } bool F(int x) //判断x所在联通是否存在自环 { return f[find(x)]; } int size(int x) //获取点x所在联通的大小 { return p[find(x)]; } int E(int x) //联通中边的数量 { return e[find(x)]; }};Part 7.5 二叉堆
Part 7.6 ST表
nlog预处理 O(1) 查询
template <class Ty, const int logn>struct RMQ{ vector<array<Ty, logn>> info1; vector<array<Ty, logn>> info2; RMQ(const vector<Ty>& A) { init(A); } void init(const vector<Ty>& A) { int n = A.size() - 1; info1.assign(A.size(), array<Ty, logn>{}); info2.assign(A.size(), array<Ty, logn>{}); for (int i = 1; i <= n; ++i) { info1[i][0] = A[i]; info2[i][0] = A[i]; } for (int j = 1; j <= logn; ++j) { for (int i = 1; i + (1 << j) - 1 <= n; ++i) { info1[i][j] = max(info1[i][j - 1], info1[i + (1 << (j - 1))][j - 1]); info2[i][j] = min(info2[i][j - 1], info2[i + (1 << (j - 1))][j - 1]); } } }
Ty Query_Max(int l, int r) { int j = log2(r - l + 1); return max(info1[l][j], info1[r - (1 << j) + 1][j]); } Ty Query_Min(int l, int r) { int j = log2(r - l + 1); return min(info2[l][j], info2[r - (1 << j) + 1][j]); }};