[高级数据结构篇]企图速成++;
Posted skywalker767
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[高级数据结构篇]企图速成++;相关的知识,希望对你有一定的参考价值。
文章目录
时间紧迫,不会记太详细。
并查集
Find函数,并查集的灵魂:
作用:寻找祖宗节点,并且路径压缩。
int find(int x)
if(x != p[x]) p[x] = find(p[x]);
return p[x];
Merge函数
合并两个点,其实不用单独写个函数,在需要的时候自己写下就好。
int merge(int a, int b)
p[find(a)] = find(b);
带权并查集
size[x]
表示集合大小,dis[x]
表示 x 到p[x]
距离。- 将第
a
列的船接到第b
列,相当于a
列中的每个点都加上size[pb]
,由于路径压缩,d[pa] = size[pb]
- 路径压缩写法:
- 找到根节点
root
- 计算父节点到上一个父节点距离,更新
d[x]
,即d[x] += p[x]
- 找到根节点
#include <bits/stdc++.h>
using namespace std;
const int N = 30010;
int n;
int siz[N] , p[N] , dis[N];
int find(int x)
if(x != p[x])
int root = find(p[x]);
dis[x] += dis[p[x]];
p[x] = root;
return p[x];
int main()
scanf("%d" , &n);
//初始化
for(int i = 0;i < N;i ++) p[i] = i , siz[i] = 1;
for(int i = 0;i < n;i ++)
char op[2];
int a , b;
scanf("%s%d%d" , op , &a , &b);
if(op[0] == 'M')
int pa = find(a);
int pb = find(b);
dis[pa] = siz[pb];
siz[pb] +=siz[pa];
p[pa] = pb;
else
int pa = find(a);
int pb = find(b);
if(pa != pb) puts("-1");
else printf("%d\\n" , max(0 , abs(dis[a] - dis[b]) - 1));
return 0;
线段树
参考文章:
Acwing算法提高课。
带权并查集:https://www.acwing.com/solution/content/11000/
以上是关于[高级数据结构篇]企图速成++;的主要内容,如果未能解决你的问题,请参考以下文章
速成大神小技巧——Mysql批量|DUPLICATE高级用法