[高级数据结构篇]企图速成++;

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]

例子Acwing238. 银河英雄传说

#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/

以上是关于[高级数据结构篇]企图速成++;的主要内容,如果未能解决你的问题,请参考以下文章

经典教程|10 分钟速成 Python3

Spark MLlib速成宝典模型篇06随机森林Random Forests(Python版)

Spark MLlib速成宝典模型篇05决策树Decision Tree(Python版)

Spark MLlib速成宝典模型篇04朴素贝叶斯Naive Bayes(Python版)

Spark MLlib速成宝典模型篇02逻辑斯谛回归Logistic回归(Python版)

速成大神小技巧——Mysql批量|DUPLICATE高级用法