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

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.hqwc.cn/news/591716.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应急响应实战笔记05Linux实战篇(2)

第2篇&#xff1a;捕捉短连接 0x00 前言 ​ 短连接&#xff08;short connnection&#xff09;是相对于长连接而言的概念&#xff0c;指的是在数据传送过程中&#xff0c;只在需要发送数据时&#xff0c;才去建立一个连接&#xff0c;数据发送完成后&#xff0c;则断开此连接…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

UE4_材质节点

UE4_材质节点 2017-12-07 13:56 跑九宫格 跑UV 评论(0)

U盘弹不出?事件查看器

使用完U盘或者硬盘遇到弹不出&#xff0c;是直接拔掉还是关机再拔&#xff1f; no no no 看这&#xff01; 1、开始菜单&#xff0c;或者叫“windows” 2.右键&#xff0c;点击按键“V”; 3.看到了事件查看器&#xff1b; 是PDF阅读器在占用文件&#xff1b; 关闭就正常了&…

Transformer学习: Transformer小模块学习--位置编码,多头自注意力,掩码矩阵

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Transformer学习 1 位置编码模块1.1 PE代码1.2 测试PE 2 多头自注意力模块2.1 多头自注意力代码2.2 测试多头注意力 3 未来序列掩码矩阵 1 位置编码模块 P E ( p o s , 2 i )…

电商技术揭秘六:前端技术与用户体验优化

文章目录 引言一、前端技术在电商中的重要性1.1 前端技术概述1.2 用户体验与前端技术的关系 二、响应式设计与移动优化2.1 响应式设计的原则2.2 移动设备优化策略2.3 响应式设计的工具和框架 三、交互设计与用户体验提升3.1 交互设计的重要性3.2 用户体验的量化与优化3.3 通过前…

简单的购物商城

SSM整合后的一个及其简单的商城&#xff0c;首页数据是模拟的&#xff0c;主要测试购物车模块 启动 创建数据库&#xff1a;shopping导入建表脚本&#xff1a;shopping.sql修改db.properties部署和启动项目&#xff08;项目的path为项目名&#xff09;访问 http://localhost:…

【web】nginx+php-fpm云导航项目部署-(简版)

一、yum安装nginx yum -y install nginx 二、php环境安装 2.1 php安装 yum -y install php 2.2 php-fpm安装 yum -y install php-fpm 注&#xff1a;PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。 2.3 项目依赖的php-xml和php-xmlrpc安装 yum -y install php-…

[C#]OpenCvSharp改变图像的对比度和亮度

目的 访问像素值mat.At<T>(y,x) 用0初始化矩阵Mat.Zeros 饱和操作SaturateCast.ToByte 亮度和对比度调整 g(x)αf(x)β 用α(>0)和β一般称作增益(gain)和偏置(bias)&#xff0c;分别控制对比度和亮度 把f(x)看成源图像像素&#xff0c;把g(x)看成输出图像像素…

32-2 APP渗透 - 移动APP架构

前言 app渗透和web渗透最大的区别就是抓包不一样 一、客户端: 反编译: 静态分析的基础手段,将可执行文件转换回高级编程语言源代码的过程。可用于了解应用的内部实现细节,进行漏洞挖掘和算法分析等。调试: 排查软件错误的一种手段,用于分析应用内部原理和行为。篡改/重打…

如何(关闭)断开 Websocket 连接:简单易懂的实现指南

WebSocket 协议提供了一条用于 Web 应用程序中双向通讯的高效通道&#xff0c;让服务器能够实时地向客户端发送信息&#xff0c;而无需客户端每次都发起请求。本文旨在探讨有关结束 WebSocket 连接的适当时机&#xff0c;内容包括协议的基础知识、如何结束连接、一些使用场景&a…

【VUE】ruoyi框架自带页面可正常缓存,新页面缓存无效

ruoyi框架自带页面可正常缓存&#xff0c;新页面缓存无效 背景&#xff1a; 用若依框架进行开发时&#xff0c;发现ruoyi自带的页面缓存正常&#xff0c;而新开发的页面即使设置了缓存&#xff0c;当重新进入页面时依旧刷新了接口。 原因&#xff1a;页面name与 getRouters …