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]);
}
};

Part 7.7 树状数组#

4-1数据结构
https://fuwari.vercel.app/posts/4-1数据结构/
作者
nszkay
发布于
2026-01-07
许可协议
CC BY-NC-SA 4.0