数据结构
并查集
主要功能
查询是否为一个集合
主要变量
pre[]:表示某个点的祖先
主要函数
find(int index)
merge(int a,int b)
树状数组
主要功能
区间求和
单点更新
主要变量
V[]:表示往左lowbit长度的区间的内值的总和
主要函数
lowbit(int index):x&-x得到最低位的1的值,表示区间长度
add(int index):往上+lowbit
sum(int index):往下-lowbit
线段树
基于分治思想的二叉树结构。
主要功能
区间求和
区间更新
主要变量
STree{
int l,r;
int dat;
}t[n*4]
主要函数
build(int l,int r,int p):给结构体赋值区间和值。递归build,当l==r时,赋值。不相等时,从p*2,p*2+1取值。
change(int p,int x,int v):从根节点出发,根据x与mid的大小关系选择左右分支,找到x==x,则更新,然后往上更新。
ask(int p,int l,int r):根据情况分为左重叠,右重叠和完全重叠。
字典树
主要功能
实现字符串快速检索
主要变量
int pos = 1;//每新增一个前缀字符(树上多一个节点),则+1
int trie[1000010][26];//存储下一个字符的位置
int num[1000010];//以此为前缀的单词的数量
bool tail[1000010]; 标记某个字符是否为单词结尾
int p = 0;局部变量,表示该前缀字符在num中的位置
主要函数
void insert(char str[]){
int p = 0;
for(int i = 0; str[i]; ++i){
int n = str[i] - 'a';
//该位置为0。则为他在num中新开辟一个空间,以记录数量
if(trie[p][n] == 0){
trie[p][n] = pos++;
}
p = trie[p][n];
num[p]++;
//根据需要打上标记
if(!str[i + 1]){
tail[p] = true;
}
}
}
int find(char str[]){//查找以某个字符串为前缀的单词数量
int p = 0;
for(int i = 0; str[i]; ++i){
int n = str[i] - 'a';
if(trie[p][n] == 0){
return 0;
}
p = trie[p][n];
}
return num[p];
}
二叉堆
主要功能
查询最值
主要变量
树的数组实现
主要函数
insert,最后一个节点插入,进行up操作
extract,最后一个节点替代顶点,进行down操作
removed,最后一个节点替代,进行up或down操作。
up
down
算法
dijkstra
每次优先队列pop,即最短路点集,flag【i】=1,队列存储的是节点。每次pop之后都要根据dist【i】+map[i][j]更新dist[j]
主要变量
dist【】,源点到某点的最短距离
map【】【】,点到点之间的距离
flag【】,是否已经在最短路点集中
主要函数
struct Node
{
int u, step;
Node() {};
Node(int a, int sp)
{
u = a, step = sp;
}
bool operator<(const Node& a)const {//重载 <
return step > a.step;
}
}
技巧
差分
给定一个数列A,差分数列为B
B[1]=A[1],B[i]=A[i]-A[i-1] (2<=i<=n)
实际上与前缀和序列为互逆运算,前缀和的差分即原序列,差分的前缀和即原序列
主要功能
区间更新:当区间[l,r]想要加1时,只需差分序列a[l]-1,a[r]+1,得到前缀和运算时,原序列该区间就会加1。
哈希打表
查看不同start的ans是否会重复,超时考虑打表。
主要变量
head[val]=tot;表示以某个哈希值为参数的第一个节点
next[tot]=tot;表示以雪花下标为参数的下一个节点的下标
snow[val];存储每个雪花的数据
主要函数
insert
hash
equal