J.砍树【蓝桥杯】树上差分+LCA

2024-03-18 16:28
文章标签 蓝桥 lca 树上 差分 砍树

本文主要是介绍J.砍树【蓝桥杯】树上差分+LCA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

树上差分

多次对树上的一些路径做加法操作,然后询问某个点或某条边经过操作后的值,就要考虑树上差分了。

点差分

在这里插入图片描述
模拟这个过程
在这里插入图片描述
对x到y路径上的点权值均+1,可以等价成对x和y的权值加1,对lca的权值-1,对fa[lca]的权值-1

  • 遍历到x,权值为1
  • 回溯到4,通过递归求得子树和,得到权值为1,
  • 遍历到7,再回溯回4,权值不变
  • 回溯到3,权值-1+1为0
  • 遍历到5,再遍历到y,y权值为1
  • 回溯到5,权值+1为1
  • 回溯到3,权值为0+1=1
  • 再回溯到2,权值为-1+1=0

故做到了通过一趟dfs就可以求出权值,且不影响其他无关的点

边差分

在这里插入图片描述
在这里插入图片描述
这个模拟的过程和点差分差不多,不过这里边的权值是映射到边下面那个点上,如这个操作是

  • x的权值+1,即4到6这条边的权值+1
  • y的权值+1,即5到8这条边的权值+1
  • lca的权值-2

砍树【蓝桥杯】例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:题目说要砍掉边,其实就是这条边是这些路径的公共边,且走了m次,用边差分,cnt[i]表示编号为i的边走过多少次,即权值,e[i]表示标号为i的点对应的边

#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;
vector<pair<int,int>> v[100005];
LL cnt[100005],f[100005][21],dep[100005],e[100005];
void dfs(int u,int fa)
{dep[u]=dep[fa]+1;f[u][0]=fa;for(int i=1;(1<<i)<=dep[u];i++) f[u][i]=f[f[u][i-1]][i-1];for(auto &p:v[u]){if(p.first==fa) continue;dfs(p.first,u);//给点赋值对应的边e[p.first]=p.second;}
}
//求LCA
int lca(int u,int v)
{if(dep[u]<dep[v]) swap(u,v);for(int i=20;i>=0;i--){if(dep[f[u][i]]>=dep[v]) u=f[u][i];if(u==v) return u;}for(int i=20;i>=0;i--){if(f[u][i]!=f[v][i]) {u=f[u][i];v=f[v][i];}}return f[u][0];
}
void dfs2(int u)
{for(auto &p:v[u]){if(p.first==f[u][0]) continue;dfs2(p.first);cnt[e[u]]+=cnt[e[p.first]];}
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<n;i++){int a,b;cin>>a>>b;//记录边及编号v[a].push_back({b,i});v[b].push_back({a,i});}dfs(1,0);for(int i=0;i<m;i++){int a,b;cin>>a>>b;//树上差分边差分操作cnt[e[a]]++;cnt[e[b]]++;cnt[e[lca(a,b)]]-=2;}//遍历回溯dfs2(1);int ans=0;for(int i=1;i<n;i++){if(cnt[i]==m) ans=i;}cout<<ans<<endl;return 0;
}

这篇关于J.砍树【蓝桥杯】树上差分+LCA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822924

相关文章

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信