备战蓝桥杯---树学初步1

news2024/11/29 0:47:10

LCA(最近公共祖先)

定义:有根树的两个节点u,v,他们的LCA是一个节点x,其中x是他们的公共祖先并且X的深度尽可能大。

法1---Tarjan算法:

核心:DFS+并查集

在并查集中建立仅有u的集合,设该集合祖先为u,对于他的每一个孩子v:dfs(v)

合并v到父节点u的集合,设置u为已遍历。

有点抽象,来看看图例吧:

首先,一开始每一个点的fa都是自己,然后遍历到11,它没有儿子,设置11为已遍历并指向5,然后到12,此时若有11与12的询问就是11的fa,标记12并到5,5指2并标记,依次类推即可

注意,这要把所有询问提前记录下来(即离线操作)

下面是模板代码:

#include<bits/stdc++.h>
using namespace std;
int fa[100000];
vector<int> a[100000];
int que[1000][1000];
bool vis[100000];
int find(int x){
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	x=find(x);
	y=find(y);
	fa[x]=y;
}
void dfs(int x,int fa){
	for(int i=0;i<a[x].size();i++){
		int y=a[x][i];
		dfs(y,x);
		merge(y,x);
	}
	vis[x]=1;
	for(int i=1;i<=n;i++){
		if(vis[i]&&que[x][i]){
			int tmp=find(i);
			cnt[tmp]+=que[x][i];
			que[x][i]=que[i][x]=0;
		}
	}
}

法2--通过DFS序转化成RMQ问题

对有根树DFS,按照遍历顺序记录2*N-1的序列即欧拉序列

我们发现两个数(u,v)(前面的先出现)的LCA就是最后一次出现的u和第一次出现的v中间的数就是从u--v的路径,而其中深度最低(包含自己)的就是其LCA。

因此我们求一个min即可,其中我们为了方便可以从第一次出现的u开始(其子树不影响)

怎么求RMQ?

1.线段树。

2.ST。

线段树大家都知道,那么就看一下ST吧

In a word,ST就是DP+倍增

我们用f[i][j]表示[i,i+2^j-1]的min,f[i][0]=a[i],因此,f[i][j]=min(f[i][j-1],f[i+2^(j-1),][j-1])

当我们要查询时,对于[10,20],我们可以先得到[10,18]的min与[19,20](根据2进制看)

我们也可以[10,18]以及[12,20]。

下面是模板代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int b[N],dp[N][N];
void rmq_st(int n){
	for(int i=1;i<=n;i++) dp[i][0]=b[i];
	int m=(int)(log(1.0*n)/log(2.0));
	for(int j=1;j<=m;j++){
		int t=n-(1<<j)+1;
		for(int i=1;i<=t;i++){
			dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
		}
	}
}
int rmp_find(int l,int r){
	int k=(int)(log(1.0*(r-l+1))/log(2.0));
	return min(dp[l][k],dp[r-(1<<k)+1][k]);
}

接下来我们看看如何编号。

我们用DFN序编号即可以(直接按照深度存的话对于一个深度可能有很多对应)

下面是实现代码:

void dfs(int x,int fa){
	int tmp=++num;
	b[++cnt]=tmp;//以DFS代替的欧拉序 
	f[tmp]=x;//实现从DFS序到真实点的映射 
	first[x]=cnt;//记录x第一次出现的位置 
	for(int i=head[x];i!=-1;i=edge[i].next){
		int v=edge[i].dian;
		if(v==fa) continue;
		dfs(v,x);
		b[++cnt]=tmp;
	}
}
int LCA(int a,int b){
	if(first[a]>first[b]) swap(a,b);
	int k=rmq_find(first[a],first[b]);
	return f[k];
}

下面介绍一下如何求两个点的距离算是应用吧:

每一个点到根的距离-2*LCA到根的距离。

下面介绍介绍常见的3种“dfs序”

欧拉序:每经过一点记录一次的序列
DFS序:记录进栈与出栈的序列。
DFN序:只记录进栈的序列。

对于这个图:

欧拉序:12552.....DFS序:1255662379.。。。DFN序(时间戳):12563....

对于时间戳:

125637948,我们记录一下每一个子树的最大时间(即最后进栈),我们发现对于256,379,任何一个子树在其中都是连着并不重复出现的,而当我们知道一个子树的最大时间就知道了对应的区间。

这有什么用呢?

在树上1.修改x变成Y,2.查以x为根的子树的权值和。

这就转化成了区间和的问题,对DFN序再用树状数组维护即可。

我们来个应用吧:

我们先按DFN,我们发现一个点要么跟父亲一样,要么是一个从来没有出现的点,这个就是合法的,于是我们令dp[i][j]表示走到i时用了j种颜色的方案数,易得状态转移方程:

dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(k-j+1).

下面是AC代码:

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,y,k,x;
long long dp[400][400];
int main(){
    cin>>n>>k;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]*(k-j+1))%mod;
        }
    }
    long long ans=0;
    for(int i=1;i<=k;i++) ans=(ans+dp[n][i])%mod;
    cout<<ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1556323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练 找无重复字符的最长子串

我们来看下这个题目&#xff0c;我们要统计的是不重复的子串&#xff0c;我们可以使用“滑动窗口法”&#xff0c;其实我们很容易就能想到思路。 我们的左窗代表我们目前遍历的开始&#xff0c;即我们遍历的子串的开头&#xff0c;右窗从左窗开始进行遍历&#xff0c;每次遍历…

安装部署MariaDB数据库管理系统

目录 一、初始化MariaDB服务 1、安装、启动数据库服务程序、将服务加入开机启动项中。 2、为保证数据库安全性和正常运转&#xff0c;需要对数据库程序进行初始化操作。 3、配置防火墙&#xff0c;放行对数据库服务程序的访问请求&#xff0c;允许管理员root能远程访问数据…

AIGC-Stable Diffusion发展及原理总结

目录 一. AIGC介绍 1. 介绍 2. AIGC商业化方向 3. AIGC是技术集合 4. AIGC发展三要素 4.1 数据 4.2 算力 4.3 算法 4.3.1 多模态模型CLIP 4.3.2 图像生成模型 二. Stable Diffusion 稳定扩散模型 1. 介绍 1.1 文生图功能&#xff08;Txt2Img) 1.2 图生图功能&…

Java复习第十二天学习笔记(JDBC),附有道云笔记链接

【有道云笔记】十二 3.28 JDBC https://note.youdao.com/s/HsgmqRMw 一、JDBC简介 面向接口编程 在JDBC里面Java这个公司只是提供了一套接口Connection、Statement、ResultSet&#xff0c;每个数据库厂商实现了这套接口&#xff0c;例如MySql公司实现了&#xff1a;MySql驱动…

python实现两个Excel表格数据对比、补充、交叉验证

业务背景 业务中需要用到类似企查查一类的数据平台进行数据导出&#xff0c;但企查查数据不一定精准&#xff0c;所以想采用另一个官方数据平台进行数据对比核验&#xff0c;企查查数据缺少的则补充&#xff0c;数据一致的保留企查查数据&#xff0c;不一致的进行颜色标注。 …

Jmeter 配置说明之线程组

一、线程组介绍&#xff1a; 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组&#xff1a; 通俗理解&#xff1a; 线程组&#xff1a;就是一个线程组&#xff0c;里面有若干个请求&#xff1b; 线程&am…

ZNC3罗德与施瓦茨ZNC3网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNC3 网络分析仪的工作频率范围为 9 kHz 至 3 GHz&#xff0c;面向移动无线电和电子产品行业的应用。它具有双向测试装置&#xff0c;用于测量有源和无源 DUT 的所有四个 S 参数。此外&#xff0c;它还提供适合开发和生产中各…

SOC子模块---存储器

存储器子系统简介 多层存储结构概念 该结构的核心是解决容量,速度,价格之间的矛盾,建立其的一种多层次存储架构;在金字塔越顶部其容量越小,价格越昂贵,但是其速度越快; Cache的出现主要解决了cpu 与主存之间速度的差异; 主存和辅存的层次结构解决了计算机对大容量,…

生态鱼缸智能养殖,系统架构与框图

功能&#xff1a;自动投食&#xff08;推拉式电磁铁&#xff09;&#xff0c;温度显示的改进&#xff08;传感器已经有了&#xff09;&#xff0c;控制灯光&#xff08;白天亮晚上灭&#xff09;&#xff0c;自动补养/水循环&#xff08;水氧监测太贵了&#xff0c;根据水温&am…

学习笔记】java项目—苍穹外卖day05

文章目录 苍穹外卖-day05课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍…

containerd系统级学习大纲

文章目录 1 理解Containerd的背景和架构 &#x1f4da;1.1 历史背景 &#x1f570;️1.2 架构细节 &#x1f527; 2 设置开发环境 &#x1f6e0;️3 源码分析 &#x1f50d;4 深入核心功能4.1 容器生命周期管理4.2 镜像管理4.3 网络管理4.4 存储与快照4.5 插件系统 5 贡献代码6…

2024/3/29打卡 填充——贪心

目录 题目 思路 代码 先来说下什么时候使用贪心和动态规划&#xff1a; 一个题目当寻找答案的过程中有大约 2的指数级&#xff08; 2^n&#xff09;个方案的时候&#xff0c;可以考虑用贪心和动态规划问题&#xff08;其实&#xff0c;我现在还不知道什么时候用 dfs 和 动态…

投稿指南【NO.15】SCI期刊推荐

写在前面&#xff1a;SCI论文发表是我国高校机构与基地评估、成果评奖、项目立项、人才培养等方面的重要考核指标&#xff0c;更不要要说关系到我们个人的毕业、晋升和前途。SCI含金量之高&#xff0c;要是读研读博科研工作期间能发表&#xff0c;将对直博、找工作、国奖申请、…

node.js的常用命令

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

c++----list模拟实现

目录 1. list的基本介绍 2. list的基本使用 2.1 list的构造 用法示例 2.2 list迭代器 用法示例 2.3. list容量&#xff08;capacity&#xff09;与访问&#xff08;access) 用法示例 2.4 list modifiers 用法示例 2.5 list的迭代器失效 3.list的模拟实现 3.1…

【PythonGIS】Python实现批量导出面矢量要素(单个多面矢量->多个单面矢量)

可怜的我周六还在工作&#xff0c;已经很久没更新过博客了&#xff0c;今天正好有空就和大家分享一下。今天给大家带来的是使用Python将包含多个面要素/线要素的矢量批量导出单个要素的矢量&#xff0c;即一个要素一个矢量文件。之前写过多个矢量文件合并成一个矢量文件的博文&…

【C++STL详解(二)】——string类模拟实现

目录 前言 一、接口总览 二、默认成员函数 1.构造函数 2.拷贝构造 写法一&#xff1a;传统写法 写法二&#xff1a;现代写法&#xff08;复用构造函数&#xff09; 3.赋值构造 写法一&#xff1a;传统写法 写法二&#xff1a;现代写法(复用拷贝构造) 4.析构函数 三、…

武汉星起航:引领跨境电商新纪元,助力卖家实现全球业务飞跃

在全球化的时代背景下&#xff0c;越来越多的中国卖家正选择跨境电商作为他们拓展国际市场的重要途径。然而&#xff0c;对于许多新手卖家而言&#xff0c;如何进入海外市场、如何运营店铺、如何推广产品&#xff0c;都是一道道难以逾越的难题。在这个关键时刻&#xff0c;武汉…

智慧公厕:改变城市生活的革命性基础设施

在现代城市的高品质生活要求背景下&#xff0c;公共厕所成为了不可或缺的基础设施。然而&#xff0c;传统的公厕在服务质量、管理效率方面存在一定的问题。为了提供更好的公厕服务&#xff0c;智慧公厕应运而生。通过智能化的管理模式&#xff0c;智慧公厕实现了公厕使用与管理…

【并发编程】线程的基础概念

一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 什么线程&#xff1f; 线程是CP…