树章节习题

news2024/11/8 11:14:52

今天也是小小的把树的章节的内容大体过了一遍,总共有树上dp,LCA(最近公共祖先),树的直径,以及树上差分

P1395 会议

很经典的树上dp里面的换根dp问题,现在这里说几个数组

sz数组,用于统计以1为节点,每个节点的子树大小

sum数组,用于统计每个子树上总节点的累加

f 数组,用于统计以每个点为根的时候的路径长度

我们通过画图分析可知,换根公式为 f [ v ] = f [ u ] - sz [ u ] + ( n - sz [ u ])

我们就可以完成这个题目了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int u,v;
vector<int> e[50005];
int sz[50005];
int sum[50005];
int f[50005];

void dfs1(int v,int fa)
{
	sz[v]=1;
	for(int u:e[v])
	{
		if(u!=fa)
		{
			dfs1(u,v);
			sz[v]+=sz[u];
		}
	}
}

void get(int v,int fa)
{
	sum[v]=0;
	for(int u:e[v])
	{
		if(u!=fa)
		{
			get(u,v);
			sum[v]+=sz[u]+sum[u];
		}
	}
}

void dfs2(int v,int fa)
{
	for(int u:e[v])
	{
		if(u!=fa)
		{
			f[u]=f[v]-sz[u]+(n-sz[u]);
			dfs2(u,v);
		}
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,0);
	get(1,0);
	f[1]=sum[1];
	dfs2(1,0);
	int maxn=0x3f3f3f3f,flag=0;
	for(int i=1;i<=n;i++)
	{
		if(f[i]<maxn)
		{
			flag=i;
			maxn=f[i];
		}
	}
	cout<<flag<<" "<<maxn;
	return 0;
} 

P3128 [USACO15DEC] Max Flow P

这道题乍一看,我没看出来哪里有最近公共祖先的思想,但是,后面在纸上写写画画的时候,发现 这其实就是最近公共祖先+树上差分

我们每次要在树上对每次提问的路径进行修改,那么我们这个是点修改,因此我们需要将经过的两个点的差分数组dif++,最近公共祖先和其父节点dif--

然后就直接出来了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int u,v;
vector<int> e[50005];
int dep[50005];
int f[50005][17];
int dif[50005];
int ans;
void dfs(int v,int fa)
{
	dep[v]=dep[fa]+1;
	f[v][0]=fa;
	for(int i=1;i<17;i++)
	{
		f[v][i]=f[f[v][i-1]][i-1];
	}
	for(int u:e[v])
	{
		if(u!=fa)
		{
			dfs(u,v);
		}
	}
}
int lca(int u,int v)
{
	if(dep[u]<dep[v])
	{
		swap(u,v);
	}
	for(int i=17-1;i>=0;i--)
	{
		if(dep[f[u][i]]>=dep[v])
		u=f[u][i];
	}
	if(u==v)
	return v;
	for(int i=16;i>=0;i--)
	{
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
void sign_up(int v,int fa)
{
	for(int u:e[v])
	{
		if(u!=fa)
		{
			sign_up(u,v);
		    dif[v]+=dif[u];
		}
	}
	ans=max(ans,dif[v]);
}
signed main()
{
	cin>>n>>k;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	for(int i=1;i<=k;i++)
	{
		cin>>u>>v;
		dif[u]++;
		dif[v]++;
		dif[lca(u,v)]--;
		dif[f[lca(u,v)][0]]--;
	}
	sign_up(1,0);
	cout<<ans;
	return 0;
}

P3398 仓鼠找 sugar

归根到底,其实还是最近公共祖先的思想,但是我们这道题要想清楚的是,我们如何判断有两条路径相交,一方面是如果两条路径相交,那么第一条路径的公共祖先一定会在第二条路径上,但是我们如何去判断一个点在一个路径上,因此我们需要用到深度数组,如果其公共祖先在a,b这条路径上,那么a~公共祖先的距离+b~公共祖先的距离=a~b的距离

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
int u,v;
vector<int> e[100005];
int dep[100005];
int f[100005][18];
void dfs(int v,int fa)
{
	dep[v]=dep[fa]+1;
	f[v][0]=fa;
	for(int i=1;i<18;i++)
	{
		f[v][i]=f[f[v][i-1]][i-1];
	}
	for(int u:e[v])
	{
		if(u!=fa)
		{
			dfs(u,v);
		}
	}
}
int lca(int u,int v)
{
	if(dep[u]<dep[v])
	swap(u,v);
	for(int i=17;i>=0;i--)
	{
		if(dep[f[u][i]]>=dep[v])
		u=f[u][i];
	}
	if(u==v)
	return v;
	for(int i=17;i>=0;i--)
	{
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];
			v=f[v][i];
		}
	}
	return  f[u][0];
}
int dis(int u,int v)
{
	int LCA=lca(u,v);
	return abs(dep[u]-dep[LCA])+abs(dep[LCA]-dep[v]);
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	int a,b,c,d;
	for(int i=1;i<=q;i++)
	{
		cin>>a>>b>>c>>d;
		int x=lca(a,b),y=lca(c,d);
		if((dis(a,y)+dis(b,y)==dis(a,b))||(dis(c,x)+dis(d,x)==dis(c,d)))
		cout<<"Y\n";
		else
		cout<<"N\n";
	}
	return 0;
}

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

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

相关文章

多模态协同学习框架 DMCL

https://arxiv.org/pdf/2408.05914 一.discriminative and robust model 早期传统的reid的工作方式&#xff0c;因无法在大规模数据集上产生有竞争力的结果&#xff0c;所以本文中为相关工作&#xff0c;并未成为本文方法。 二.Dynamic Multimodal Feature Fusion Strategy 提…

计算机毕业设计选题推荐-产品订单管理系统-产品销售管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

YOLOv8目标检测推理流程及Python代码

在这章中将介绍目标检测推理原理,以及基于onnx模型使用Python语言进行推理。在推理原理章节中,将了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作等;在Python代码篇,将给出推理代码。 这里注意一下的是,由于在导出onnx模型…

【数学分析笔记】第2章第4节收敛准则(2)

2. 数列极限 2.4 收敛准则 2.4.1 单调有界定理 【例2.4.3】 x 1 2 , x n 1 3 2 x n , n 1 , 2 , 3 , . . . x_{1}\sqrt{2},x_{n1}\sqrt{32x_{n}},n1,2,3,... x1​2 ​,xn1​32xn​ ​,n1,2,3,...&#xff0c;证明 { x n } \{x_{n}\} {xn​}收敛并求极限。 【证】 0 <…

InternVL 多模态模型部署微调实践

一、什么是InternVL nternVL 是一种用于多模态任务的深度学习模型&#xff0c;旨在处理和理解多种类型的数据输入&#xff0c;如图像和文本。它结合了视觉和语言模型&#xff0c;能够执行复杂的跨模态任务&#xff0c;比如图文匹配、图像描述生成等。通过整合视觉特征和语言信…

中仕公考怎么样?事业编联考、统考、单招介绍

一、事业编考试流程 发布公告——注册报名——交报名费——报名确认——打印准考证|——笔试——调剂——面试——体检——录用 二、招聘公告查看渠道&#xff1a; ①事业单位招聘网 事业单位公告都会发布&#xff0c;包括各类招考信息、报名信息等; ②各省人事考试网 是…

Telnet不止于端口测试:探索经典工具的多样化应用

文章目录 Telnet详解与实用指南1. 引言2. Telnet 的安装和启动2.1 在 Windows 上安装 Telnet2.2 在 Linux 上安装 Telnet2.3 在 macOS 上使用 Telnet 3. Telnet 的基本命令与操作3.1 远程登录3.2 测试端口连通性3.3 调试网络服务3.4 网络协议调试3.5 简单的文件传输 4. Telnet …

继承的初始化顺序

B类继承A类后&#xff0c;new B()后执行顺序如下&#xff1a; 1、执行A类的静态方法&#xff08;只执行一次&#xff09; 2、执行B类的静态方法&#xff08;只执行一次&#xff09; 3、执行A类的成员变量的赋值&#xff08;没有赋值操作则忽略此步&#xff09; 4、执行A类的…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)taks2(2.1+2.2+2.3)

task2.1 自适应学习率 临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。 一般在训练一个网络的时候&#xff0c;损失原来很大&#xff0c;随着参数不断的更新&#xff0c;损失会越来越小&#xff0c;最后就卡住了&#xff0c;损失不再下降。当我们走到临界点的时…

VLDB 2024 即将来袭!创邻科技将带来精彩分享

8月26-30日&#xff0c;数据库领域最权威、影响力最大的顶级盛会之一&#xff0c;VLDB 2024 来了&#xff01; VLDB&#xff08;International Conference on Very Large Databases&#xff09;是数据管理、可扩展数据科学和数据库研究人员、厂商、应用开发者以及用户广泛参与…

ssrf简介

目录 SSRF漏洞 漏洞原理 形成原因 SSRF用途: 怎么找到SSRF漏洞? 漏洞案例 SSRF漏洞 漏洞原理 SSRF(Server-Side Request Forgery:服务器端请求伪造)是——种由仅专构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。(因为他是…

【原创】java+swing+mysql健身房管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

无人机RTK定位定向技术详解

无人机RTK&#xff08;Real-Time Kinematic&#xff0c;实时动态差分技术&#xff09;定位定向技术&#xff0c;是无人机领域的一项高精度导航与定位技术。它结合了全球导航卫星系统&#xff08;如GPS、GLONASS、Galileo、BDS等&#xff09;与实时差分技术&#xff0c;通过地面…

精彩管道不会梦到深沉蓝调

如果上天开了眼 请多给我点蓝调 多给我点沙锤 多给我点甲壳 让我吃鸡&#xff01; 星元自动机&#xff0c;新的版本之神 给宁磕一个 完蛋 你说这不是问题吗 我这篇文章从我写开始&#xff0c;到写完 炉石都换赛季了&#xff01;&#xff01;&#xff01;&#xff01…

HTB-Redeemer(redis)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Redeemer这台机器&#xff0c;主要是对redis组件进行渗透&#xff0c;了解思路 渗透过程 更改一下 目录结构&#xff0c;先写 渗透过程&#xff0c;再写 题解 信息搜集 通过nmap扫描 发现开启了6379…

sklearn中的线性回归

多元线性回归 指的 是一个样本 有多个特征的 线性回归问题。 w 被统称为 模型的 参数&#xff0c;其中 w0 被称为截距&#xff08;intercept&#xff09;&#xff0c;w1~wn 被称为 回归系数&#xff08;regression coefficient&#xff09;。这个表达式和 yazb 是同样的…

CMake构建学习笔记4-libjpeg库的构建

libjpeg是一个广泛使用的开源库&#xff0c;用于处理JPEG&#xff08;Joint Photographic Experts Group&#xff09;图像格式的编码、解码、压缩和解压缩功能&#xff0c;是许多图像处理软件和库的基础。 libjpeg本身的构建没什么特别的&#xff0c;不过值得说道的是libjpeg存…

『功能项目』摄像机跟随角色【07】

我们打开上一篇06新输入系统项目&#xff0c; 本章要做的事情是摄像机跟随主角移动&#xff0c; 给主角增加一个Player标签方便主摄像机查找主角对象 在编辑场景调好角度&#xff0c;选择Main Camera对象按键盘Ctrl Shift F使运行场景与编辑场景相同 新建CameraCtrl脚本代码 …

Linux_NAT网络原理图,网络配置指令

目录 linux网络配置原理图 查看网络IP和网关 查看虚拟网络编辑器和修改IP地址 查看网关 ping测试主机之间网络连通性 linux网络配置原理图 ping指令的意思是连通上网&#xff0c;可以检测是否这个地址是否通。 比如我们在虚拟机里可以在火狐浏览器上打开百度。 使用ifco…

框架——动态SQL

目录 1.Mybatis动态SQL 2.MyBatis 中用于实现动态 SQL 的元素 3.查所有 4.If 元素 5.trim 元素 6.Choose 元素 7.set 元素 8.foreach 元素 根据传入id删除学生信息 根据传入列名查询学生相关信息 1.Mybatis动态SQL MyBatis 的一个强大的特性之一通常是它的动态 SQL 能…