当前位置: 首页 > news >正文

树上差分+lca 黑暗的锁链

//** 太久不写了,感觉很难受。。。比赛最近打得也不好,课内任务又重,还要忙着做项目。何去何从。

今天又写了一题,用了树上差分的知识。下面来整理整理。

1.首先让我们学一下lca(最小公共父节点) 

我用的是倍增来求的。总共其实就是两步:dfs打ST表预处理每个点的上面节点  lca求两点最小公共节点。lca里用了类似dp的思想。首先要知道dep[i][j]表示 i点向上跳1<<j个点后到达的点。然后想出递推关系式:dep[i][j]=dep[dep[i][j-1]][j-1]。用dfs来递推实现即可。

lca的实现其实就是 1.先将两个点化为同一层的点

                               2.寻找那一层的父节点是一样的

下面来看一下代码~

//倍增法求最近公共祖先LCA
#include<iostream>
using namespace std;int n,m;struct EDGE{int u,v,l;EDGE* ne;
}edge[100010];struct NODE{EDGE* fir;
}node[100010];int tot;
void my_build(int u,int v,int l){edge[tot].u=u;edge[tot].v=v;edge[tot].l=l;edge[tot].ne=node[u].fir;node[u].fir=&edge[tot];tot++;
}int ce[100010],dep[100010][20];//ce表示每个点的层数  dep[i][j]表示从第i个点向上走 1<<j (2^j) 个点到达的点位置;
/*
dep[i][j]=dep[dep[i][j-1]][j-1];  递推关系式
*/
void dfs(int u,int f){//打ST表   复杂度:nlognce[u]=ce[f]+1;dep[u][0]=f;for(int i=1;i<=19;i++){dep[u][i]=dep[dep[u][i-1]][i-1];//类似dp}EDGE* i=node[u].fir;while(i!=NULL){if(i->v==f){i=i->ne;continue;}dfs(i->v,u);i=i->ne;}
}int lca(int u,int v){  //LCA   复杂度:lognif(ce[u]<ce[v]){swap(u,v);}for(int i=19;i>=0;i--){if(ce[dep[u][i]]>=ce[v]){u=dep[u][i];}}if(u==v)return u;for(int i=19;i>=0;i--){if(dep[u][i]!=dep[v][i]){u=dep[u][i];v=dep[v][i];}}return dep[u][0];
}int main()
{cin>>n>>m;//建边之类...略;return 0;
}

2.树上差分

树上差分分两种:1.给点差分      2.给边差分  

对应着两种不一样的题意:给点操作还是给边操作。

给点操作很好理解,就是每个点加加减减。但如果要给边操作,我们无法轻松表示边呐,so我们就以点代边,每个点表示其与父节点连接的边。

看一下操纵吧~

//给每个点做差分:例如 给u->v路径上所有点+1:sum[u]++; sum[v]++; sum[lca]-=2;
//给边做差分->归结到给点做差分:sum[u]++; sum[v]++; sum[lca]-=1; sum[fa[lca]]-=1;//差分数组求前缀和:
void my_add(int u,int fa){//差分数组求前缀和;EDGE* i=node[u].fir;while(i!=NULL){if(i->v==fa){i=i->ne;continue;}dfs(i->v,u);sum[u]+=sum[i->v];i=i->ne;}
}//差分数组:(以给边差分为例)
while(m--){cin>>u>>v;int l=lca(u,v);sum[u]++;sum[v]++;sum[l]--;sum[dep[l][0]]--;
}

3.看题目


问题 : 黑暗的锁链

题目描述

传说中的暗之连锁被人们称为Dark。Dark是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。经过研究,你发现Dark呈现无向图的结构,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N–1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。
你的任务是把Dark斩为不连通的两部分。一开始Dark的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark就会进入防御模式,主要边会变为无敌的而附加边可以被切断。但是你的能力只能再切断Dark的一条附加边。现在你想要知道,一共有多少种方案可以击败Dark。注意,就算你第一步切断主要边之后就已经把Dark斩为两截,你也需要切断一条附加边才算击败了Dark。

输入

第一行包含两个整数N和M。
之后N–1行,每行包括两个整数A和B,表示A和B之间有一条主要边。
之后M行以同样的格式给出附加边。

输出

输出一个整数表示答案。

样例输入 Copy
4 1
1 2
2 3
1 4
3 4
样例输出 Copy
3
提示

对于20%的数据,N≤100,M≤100。
对于100%的数据,N≤100000,M≤200000。数据保证答案不超过231–1。


这题用的就是树上差分+lca。而且是面向边的树上差分(因为是要切边)。

看代码~

#include<iostream>
using namespace std;
#define int long long int n,m;struct EDGE{int u,v;EDGE* ne;
}edge[1000010];struct NODE{EDGE* fir;
}node[1000010];int tot;
void my_build(int u,int v){edge[tot].u=u;edge[tot].v=v;edge[tot].ne=node[u].fir;node[u].fir=&edge[tot];tot++;
}int dep[100010][20],ce[1000010];
void dfs(int u,int fa){ce[u]=ce[fa]+1;EDGE* i=node[u].fir;dep[u][0]=fa;for(int j=1;j<20;j++){dep[u][j]=dep[dep[u][j-1]][j-1];}while(i!=NULL){if(i->v==fa){i=i->ne;continue;}dfs(i->v,u);i=i->ne;}
}int lca(int u,int v){if(ce[u]<ce[v]){swap(u,v);}for(int i=19;i>=0;i--){if(ce[dep[u][i]]>=ce[v]){u=dep[u][i];}}if(u==v)return u;for(int i=19;i>=0;i--){if(dep[u][i]!=dep[v][i]){u=dep[u][i];v=dep[v][i];}}return dep[u][0];
}int sum[1000010];
void my_add(int u,int fa){EDGE* i=node[u].fir;while(i!=NULL){if(i->v==fa){i=i->ne;continue;}my_add(i->v,u);//注意不是dfs(找了很久的bug...)sum[u]+=sum[i->v];i=i->ne;}
}signed main()
{cin>>n>>m;int u,v;for(int i=1;i<=n-1;i++){cin>>u>>v;my_build(u,v);my_build(v,u);}dfs(1,0);for(int i=1;i<=m;i++){cin>>u>>v;int l=lca(u,v);sum[u]++;sum[v]++;sum[l]-=2;}my_add(1,0);int ans=0;for(int i=2;i<=n;i++){if(sum[i]==0){ans+=m;//注意是+m!!!}else if(sum[i]==1){ans++;}}cout<<ans;return 0;
}

相关文章:

树上差分+lca 黑暗的锁链

//** 太久不写了&#xff0c;感觉很难受。。。比赛最近打得也不好&#xff0c;课内任务又重&#xff0c;还要忙着做项目。何去何从。 今天又写了一题&#xff0c;用了树上差分的知识。下面来整理整理。 1.首先让我们学一下lca&#xff08;最小公共父节点&#xff09; 我用的…...

opencv4.5.5 GPU版本编译

一、安装环境 1、opencv4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv/archive/refs/tags/4.5.5.ziphttps://gitee.com/mirrors/opencv/tree/4.5.0 2、opencv-contrib4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv_contrib/archive/refs/tags/4…...

线性跟踪微分器TD详细测试(Simulink 算法框图+SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…...

LabVIEW闪退

LabVIEW闪退或无法启动可能由多个原因引起&#xff0c;特别是在使用了一段时间后突然发生的问题。重启电脑后 LabVIEW 和所有 NI 软件都无法打开&#xff0c;甚至在卸载和重装时也没有反应。这种情况通常与系统环境、软件冲突或 NI 软件组件的损坏有关。 1. 检查系统和软件冲突…...

【WPF】03 动态生成控件

说明 今天记录一篇关于动态生成控件的方法&#xff0c;也是反复查了一些资料&#xff0c;逐步完善成自己需要的方法&#xff0c;感觉还是比较好用的。通过这个需求&#xff0c;在网上也找了一些资料&#xff0c;发现了一个开源图形UI组件HandyControl&#xff0c;觉得比较好&a…...

调试LTE模块碰到的4字节对齐问题

在调试LTE模块&#xff0c;有两个模块&#xff0c;碰到两种4字节对齐问题&#xff0c;其错误提示都是类似如下的内容&#xff1a; DWC_OTG: dwc_otg_hcd_urb_enqueue urb->transfer_buffer address not align to 4-byte 0xee419e8e 都是USB控制器处理的数据时需要4字节对齐…...

一篇讲完HTML核心内容

一、HTML 1、 HTML概念 网页&#xff0c;是网站中的一个页面&#xff0c;通常是网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗的说&#xff0c;网站就是由网页组成的。通常我们看到的网页都是以htm或html后缀结尾的文件&#xff0c;俗称 HTML文件。 2、…...

2024icpc(Ⅱ)网络赛补题 G

2024icpc(Ⅱ)网络赛补题 G 题目链接&#xff1a;The 2024 ICPC Asia EC Regionals Online Contest (II) G、Game 题意&#xff1a; 给定Alice和Bob的每一轮的概率 p 0 , p 1 p_0, p_1 p0​,p1​ 给定Alice和Bob的初始数字 x , y x,y x,y。 对于每一轮&#xff1a; 如果Al…...

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代&#xff01;AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC&#xff0c;也就是人工智能生成内容&#xff0c;它就像是一股汹涌的浪潮&#xff0c;席卷了整个科技世界。它的出现&#xff0c;让我们看到了人工智能的无限潜力&#xff0c;也…...

Kubernetes调度单位Pod

Kubernetes调度单位Pod 1 Pod简介 不直接操作容器container。 一个 pod 可包含一或多个容器&#xff08;container&#xff09;&#xff0c;它们共享一个 namespace&#xff08;用户&#xff0c;网络&#xff0c;存储等&#xff09;&#xff0c;其中进程之间通过 localhost 本地…...

C语言指针篇

要想学好C语言&#xff0c;作为灵魂的指针那是必须要掌握的&#xff0c;而要想搞定指针&#xff0c;就不得不讲一下内存和地址之间的关系 内存和地址 计算机上的CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处…...

Unity 使用Editor工具查找 Prefab 中的指定脚本

在 Unity 项目中&#xff0c;随着项目规模的扩大和 Prefab 数量的增加&#xff0c;管理和定位 Prefab 中的脚本变得更加复杂。为了提高开发效率&#xff0c;所以需要编写一个自定义的 Unity Editor 工具&#xff0c;帮助查找某个 Prefab 中是否使用了指定的脚本。本文将介绍如何…...

Frida-JSAPI:Interceptor使用

拦截器 Interceptor.attach(target, callbacks[, data]) 参数分析 target &#xff1a;target是一个NativePointer&#xff0c;用于指定想要拦截的函数的地址。callbacks &#xff1a;参数是一个包含一个或多个回调函数的对象。 onEnter(args) 回调函数&#xff0c;接收一个参…...

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…...

git学习报告

文章目录 git学习报告如何配置vscode终端安装PowerShell安装 Microsoft.Powershell.Preview使用 git的使用关于团队合作 git指令本地命令&#xff1a;云端指令 git学习报告 如何配置vscode 安装powershell调教window终端&#xff0c;使其像Linux一样&#xff0c;通过Linux命令…...

Spring MVC的应用

目录 1、创建项目与maven坐标配置 2、核心配置 3、启动项目测试 4、不同请求参数在controller的配置 4.1 servlet API 4.2 简单类型 4.3 pojo类型 4.4 日期类型 4.5 restful风格4种操作类型 4.5.1 GET&#xff1a;获取资源 4.5.2 POST&#xff1a;新建资源 4.5.3 P…...

JavaEE: 深入探索TCP网络编程的奇妙世界(六)

文章目录 TCP核心机制TCP核心机制九: 面向字节流TCP核心机制十: 异常处理 小小的补充(URG 和 PSH)~TCP小结TCP/UDP 对比用UDP实现可靠传输(经典面试题) 结尾 TCP核心机制 上一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(五) 书接上文~ TCP核心机制九: 面向字节流 TCP是面…...

探秘 Web Bluetooth API:连接蓝牙设备的新利器

引言 随着物联网技术的快速发展&#xff0c;蓝牙设备在日常生活中扮演着越来越重要的角色。而在 Web 开发领域&#xff0c;Web Bluetooth API 的出现为我们提供了一种全新的方式来连接和控制蓝牙设备。本文将深入探讨 Web Bluetooth API 的使用方法和原理&#xff0c;帮助开发…...

Kubernetes Pod调度基础(kubernetes)

实验环境依旧是k8s快照&#xff0c;拉取本次实验所需的镜像文件&#xff1b; 然后在master节点上传已经编写好的yaml文件&#xff1b; 然后同步会话&#xff0c;导入镜像&#xff1b; pod控制器&#xff1a; 标签选择器--》标签&#xff1a; 标签&#xff1a; 在Kubernetes&…...

Angular由一个bug说起之十:npm Unsupported engine

我们在用npm下载包的时候&#xff0c;有时候会碰到这样的提示 这是npm的警告&#xff0c;说我们使用的nodejs版本与下载的包所要求的nodejs版本不一致。 这是因为有些包它对nodejs的版本有要求&#xff0c;然后就会在package.json文件里的engines字段里声明它所要求的nodejs版本…...

从零到集群:基于Rocky Linux ARM64的虚拟化平台构建与自动化部署实战

1. 环境准备与基础配置 第一次接触ARM64架构的虚拟化平台搭建时&#xff0c;我踩过不少坑。不同于常见的x86环境&#xff0c;Rocky Linux ARM64在驱动支持和软件生态上有其特殊性。我们先从最基础的物理服务器配置说起。 假设你面前是一台刚拆封的ARM架构服务器&#xff0c;我…...

OpenCascade实战:TopoDS_Shape数据结构的高效遍历与优化策略

1. TopoDS_Shape数据结构基础解析 在OpenCascade中&#xff0c;TopoDS_Shape是构建三维模型的基石。这个看似简单的类实际上包含了三个关键数据成员&#xff1a;myTShape、myLocation和myOrient。理解这三个字段的运作机制&#xff0c;是高效操作模型的前提。 myTShape是一个智…...

速腾RS-M1激光雷达到手后,Windows电脑上5分钟搞定点云可视化(保姆级避坑指南)

速腾RS-M1激光雷达开箱实战&#xff1a;Windows系统5分钟点云可视化全攻略 拆开速腾RS-M1激光雷达包装箱的那一刻&#xff0c;多数人的第一反应既兴奋又忐忑——这台价值数万元的设备能否快速展现它的三维感知能力&#xff1f;作为一款广泛应用于机器人导航、三维测绘的高精度雷…...

BetterNCM Installer:让网易云音乐插件安装化繁为简的利器

BetterNCM Installer&#xff1a;让网易云音乐插件安装化繁为简的利器 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾因复杂的插件安装流程望而却步&#xff1f;是否在面对命…...

忍者像素绘卷效果实测:32色感在移动端微信小程序的色彩还原精度

忍者像素绘卷效果实测&#xff1a;32色感在移动端微信小程序的色彩还原精度 1. 测试背景与目标 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工具&#xff0c;主打16-Bit复古游戏美学风格。本次测试聚焦于其在移动端微信小程序环境下的色彩还原能力&#xff0c;特…...

解放双手!用Python自动化Adobe Premiere Pro视频编辑的终极指南 [特殊字符]

解放双手&#xff01;用Python自动化Adobe Premiere Pro视频编辑的终极指南 &#x1f3ac; 【免费下载链接】pymiere Python for Premiere pro 项目地址: https://gitcode.com/gh_mirrors/py/pymiere 还在为重复的视频编辑任务而烦恼吗&#xff1f;PyMiere项目让你用Pyt…...

Win11Debloat完整指南:如何一键清理Windows系统,提升51%性能的免费神器

Win11Debloat完整指南&#xff1a;如何一键清理Windows系统&#xff0c;提升51%性能的免费神器 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other …...

YOLOv11模型转换避坑指南:如何正确修改pnnx.py适配不同输入尺寸

YOLOv11模型转换避坑指南&#xff1a;如何正确修改pnnx.py适配不同输入尺寸 在计算机视觉领域&#xff0c;YOLO系列模型因其高效的检测性能而广受欢迎。YOLOv11作为该系列的最新成员&#xff0c;在保持实时性的同时进一步提升了检测精度。然而&#xff0c;当我们需要将训练好的…...

PT助手Plus终极配置指南:三步实现智能自动化下载生态

PT助手Plus终极配置指南&#xff1a;三步实现智能自动化下载生态 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 项目地…...

手机也能跑AI?实测3B以下小模型在安卓/iOS端的部署教程(附性能对比)

手机端AI模型实战&#xff1a;3B以下小模型在安卓/iOS的部署与优化指南 当ChatGPT需要数据中心级算力支撑时&#xff0c;你可能没想到自己的手机也能运行类似技术。本文将带你探索移动端AI部署的完整方案——从Termux环境配置到CoreML模型转换&#xff0c;实测Redmi Note 12 Tu…...