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;
}

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

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

相关文章

MySQL-----事务

一 事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一 个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 例如:银行转账 张三 ---(转账1000元)---> 李四 在进行…

亚马逊云科技Glue

Glue 最重要的部分&#xff0c; ETL&#xff1a;用于从 A 点&#xff08;我们的源数据&#xff09;提取、转换和加载数据到 B 点&#xff08;目标文件或数据存储库&#xff09;。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作&#xff0c;需要从各种来源进行组合…

linuxOPS基础_linux命令合集

uname查看操作系统信息 命令&#xff1a;uname [参数] 作用&#xff1a;获取计算机操作系统相关信息 参数&#xff1a;-a&#xff0c;选项-a代表all&#xff0c;表示获取全部的系统信息&#xff08;类型、全部主机名、内核版本、发布时间、开源计划&#xff09; 用法一&…

微信小程序关闭首页广告

由于之前微信小程序默认开启了首页广告位。导致很多老人误入广告页的内容&#xff0c;所以想着怎么屏蔽广告。好家伙&#xff0c;搜索一圈&#xff0c;要么是用户版本的屏蔽广告&#xff0c;或者是以下一个模棱两可的答案&#xff0c;要开发者设置一下什么参数的&#xff0c;如…

介绍一款鼠标无边界软件

"Mouse without Borders" 是一款由微软开发的免费工具&#xff0c;旨在帮助用户在多台计算机之间实现无缝的鼠标和键盘共享。通过 Mouse without Borders&#xff0c;用户可以在一个主控制台上控制多台计算机&#xff0c;就像操作一个大型虚拟桌面一样。 这个工具可…

15届蓝桥杯第三期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_奇数次数&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_台阶方案&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_约数个数&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_最…

项目经验总结

最近一家公司的重要项目 项目背景 之前是基于ruby gitlab开源代码 进行的侵入式修改的代码托管平台&#xff0c;后面ruby性能问题无法满足日益增长的访问量&#xff0c;遇到性能瓶颈&#xff0c;转为使用Java自研开发的。 系统演进过程 ruby代码 → 拆分为多个微服务 &…

Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录 SpringBoot-Web应用-路由响应 SpringBoot-数据库应用-Mybatis SpringBoot-模版引擎-Thymeleaf 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

【集成开发环境】-VS Code:C/C++ 环境配置

简介 VS Code&#xff0c;全称Visual Studio Code&#xff0c;是一款由微软开发的跨平台源代码编辑器。它支持Windows、Linux和macOS等操作系统&#xff0c;并且具有轻量级、高效、可扩展等特点&#xff0c;深受广大开发者的喜爱。 VS Code拥有丰富的功能特性&#xff0c;包括…

Linux下的多线程编程:原理、工具及应用(3)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行&#xff0c;本应用并不参与其中的布局和渲染。 通常用于有进程隔离诉求的模块化开发场景。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0…

数星星 刷题笔记 (树状数组)

依题意 要求每个点 x, y 的左下方有多少个星星 又因为 是按照y从小到大 给出的 所以 我们在计算个数的时候是按照y一层层变大来遍历的 因此我们在处理每一个点的时候 只需要看一下 当前的点有多少个点的x值比当前点小即可 树状数组的 操作模板 P3374 【模板】树…