LibreOJ #10131. 「一本通 4.4 例 2」暗的连锁 题解 树上差分

暗的连锁

题目描述

Dark 是一张无向图,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N−1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M 条附加边。

你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark 就会进入防御模式,主要边会变为无敌的而附加边可以被切断。但是你的能力只能再切断 Dark 的一条附加边。

现在你想要知道,一共有多少种方案可以击败 Dark。注意,就算你第一步切断主要边之后就已经把 Dark 斩为两截,你也需要切断一条附加边才算击败了 Dark。

输入描述

第一行包含两个整数 N 和 M;

之后 N - 1 行,每行包括两个整数 A 和 B,表示 A 和 B 之间有一条主要边;

之后 M 行以同样的格式给出附加边。

输出描述

输出一个整数表示答案。

样例 #1

样例输入 #1

4 1
1 2
2 3
1 4
3 4

样例输出 #1

3

提示

对于 100% 的数据, 1 ≤ N ≤ 1 0 5 , 1 ≤ M ≤ 2 × 1 0 5 1≤N≤10^5,1≤M≤2×10^5 1N105,1M2×105。数据保证答案不超过 2 31 − 1 2^{31}−1 2311

原题

LOJ——传送门

思路

题目求的是切断一条主要边和一条附加边后使得整张图变为不连通的两部分的方案数。由于题目保证所有主要边构成一棵树,我们可以枚举所有主要边,然后判断有多少个附加边与该主要边组合后能使得整张图变为不连通的两部分。事实上,当我们枚举每个点到其父亲的主要边时,一共有三种情况:

  • 当除去直接相连的主要边之外的连通两点的路径个数 = 0 =0 =0 时,删去该主要边即可破坏整张图,任意选择一条次要边都满足条件,贡献为 m m m
  • 当除去直接相连的主要边之外的连通两点的路径个数 = 1 =1 =1 时,删去该主要边后必须删去连通两点的唯一次要边,贡献为 1 1 1
  • 当除去直接相连的主要边之外的连通两点的路径个数 > 1 >1 >1 时,删去该主要边和任意一条次要边都无法破坏整张图,贡献为 0 0 0

问题就只剩下如何求某个点到其父亲的路径个数。我们可以采用树上差分的方法,对于任意一条连接节点 u 和节点 v 的附加边,我们令 d i f [ u ] + 1 , d i f [ v ] + 1 , d i f [ L C A ( u , v ) ] − 2 dif[u]+1,dif[v]+1,dif[LCA(u,v)]-2 dif[u]+1dif[v]+1dif[LCA(u,v)]2。然后再对树上差分求前缀和,这样所得到的 d i f [ i ] dif[i] dif[i] 就记录了节点 i i i 与它父亲之间的路径个数(除去直接相连的主要边之外)。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;const int MAX = 2e5 + 6;
int n, m;
struct TREE
{vector<int> e[MAX];int depth[MAX];int fa[MAX][26];int dif[MAX];void add(int u, int v) // 添加无向边{e[u].push_back(v);e[v].push_back(u);}void getDepth(int u, int fath) // 获得每个节点的深度及父亲{fa[u][0] = fath;depth[u] = depth[fath] + 1;for (auto v : e[u]){if (v != fath)getDepth(v, u);}}void init(){getDepth(1, 1);for (int i = 1; i <= 20; i++){for (int j = 1; j <= n; j++){fa[j][i] = fa[fa[j][i - 1]][i - 1]; // 记录每个节点的倍增祖先}}}int lca(int x, int y){if (depth[x] < depth[y])swap(x, y);// 先将x和y的深度调节成一致的for (int i = 20; i >= 0; i--){if (depth[fa[x][i]] >= depth[y]){x = fa[x][i];}}// 再一起向低深度跳跃,从而找到最近公共祖先if (x == y)return x;for (int i = 20; i >= 0; i--){if (fa[x][i] != fa[y][i]){x = fa[x][i];y = fa[y][i];}}return fa[x][0];}void insert(int u, int v) // 树上差分{dif[u]++;dif[v]++;dif[lca(u, v)] -= 2;}void dfs(int u) // 用dfs求出树上差分的前缀和{for (auto v : e[u]){if (v != fa[u][0]){dfs(v);dif[u] += dif[v];}}}
} tree;int main()
{ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;int u, v;for (int i = 1; i < n; i++){cin >> u >> v;tree.add(u, v); // 添加主要边}tree.init();for (int i = 1; i <= m; i++){cin >> u >> v;tree.insert(u, v); // 添加次要边}tree.dfs(1); // 树上差分求前缀和,从而求出每个节点到其父亲节点(除去直接相连的主要边之外的)的路径个数i64 ans = 0;for (int i = 2; i <= n; i++){if (tree.dif[i] == 0) // 此时删去主要边即可破坏整张图,所以任意选择一条次要边都满足条件,贡献为mans += m;if (tree.dif[i] == 1) // 此时删去主要边后必须删去连通两点的唯一次要边,贡献为1ans++;// 当除去直接相连的主要边之外的路径个数大于1时,删去该主要边和任意一条次要边都无法破坏整张图,贡献为0}cout << ans << '\n';return 0;
}

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

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

相关文章

解决!word转pdf时,怎样保持图片不失真

#今天用word写了期末设计报告&#xff0c;里面有很多过程的截图&#xff0c;要打印出来&#xff0c;想到pdf图片不会错位&#xff0c;就转成了pdf&#xff0c;发现图片都成高糊了&#xff0c;找了好多方法&#xff0c;再不下载其他软件和插件的情况下&#xff0c;导出拥有清晰的…

BarTender 常见的使用要点

BarTender 简述 BarTender是由美国海鸥科技&#xff08;Seagull Scientific&#xff09;推出的一款条码打印软件&#xff0c;被广泛应用于标签、条形码、证卡和RFID标记的设计和打印领域。它在全球范围内拥有众多用户&#xff0c;被公认为标签打印方面的全球领先者。BarTender…

JavaScript基础用法(变量定义、输入输出、转义符、注释和编码规范)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

conda实现根据序号创建、删除或激活虚拟环境(实用脚本)

不知道用过conda的朋友,你们是否有这样一个困扰,在创建和删除与切换虚拟环境的时候,总感觉很麻烦,有时候,命令又记不住,有没有一个简单的方法,来简化我们的操作,比如通过一个脚本帮我实现,进行控制台交互,就可以轻松实现,conda的创建,激活与删除操作,而不需要记住…

对比 JSON 和 Hessian2 的序列化格式

关于服务通信&#xff0c;我了解到Spring Cloud LoadBalancer 和 Dubbo 的数据传输方式有所不同。它们分别使用不同的协议和技术栈来实现服务之间的通信。 他们两者对比可知&#xff1a; 特性Spring Cloud LoadBalancerDubbo主要协议HTTP/RESTDubbo 协议&#xff08;默认&…

史上最详细四叉树地图不同技术应用和代码详解

四叉树地图在计算机和机器人领域应用的很广&#xff0c;但是初学者可能会发现四叉树地图有各种不同的实现方式&#xff0c;很多在机器人领域不适用或是在计算机存储领域不适用。今天我就讲解下各类四叉树的实现方式和应用场景。 史上最详细四叉树地图不同技术应用和代码详解 本…

vue3+ts webVTT与JSON之前格式互转

vue interface Cue {startTime: stringendTime: stringcontent: string// 可以根据需要添加其他属性&#xff0c;如样式、行号等 } /** desc WebVtt转 JSON */ export function parseWebVTT(vttContent: any): Cue[] {const cues: Cue[] []if (!vttContent) {return []}const …

Bio-Info每日一题:Rosalind-06-Counting Point Mutations

&#x1f389; 进入生物信息学的世界&#xff0c;与Rosalind一起探索吧&#xff01;&#x1f9ec; Rosalind是一个在线平台&#xff0c;专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战&#xff0c;帮助用户从基础到高级掌握生物信息学知识。无论你是初…

详解MySQL的MVCC机制

多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理&#xff0c;允许读写操作并发进行&#xff0c;从而避免了传统锁机制带…

Navicat导入json文件(json文件数据导入到MySQL表中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

mqttjs发送成功回调

在mqttjs中&#xff0c;发送成功回调可以通过设置client.publish()方法的callback参数来实现。以下是一个示例&#xff1a; javascript const mqtt require(mqtt); const client mqtt.connect(mqtt://test.mosquitto.org); client.on(connect, () > { const topic test…

多目标融合参数搜索

多目标融合 权重分类目人群。 trick normlize 不同Score之间含义、量级和分布差异较大&#xff1a;评分计算的不同部分的意义、范围和分布存在显著差异&#xff0c;这使得直接比较或融合它们的结果变得困难。显式反馈&#xff08;如点赞率&#xff09;存在用户间差异&#…

【AI】人工智能(AI)的崛起与未来展望

人工智能&#xff08;AI&#xff09;的崛起与未来展望 描述一、AI的基本概念二、AI的发展历程三、AI的应用场景与代码示例四、AI在自动驾驶中的应用五、AI的未来展望 描述 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域的热门话题。…

git拉取合并分支冲突解决

这个错误信息 ! [rejected] release_zfbchk -> dev1 (non-fast-forward) 表示 Git 拒绝执行 git pull 操作&#xff0c;因为远程分支 release_zfbchk 的更新不能直接合并到本地分支 dev1&#xff0c;因为这不是一次快进&#xff08;fast-forward&#xff09;合并。 在 Git …

【9】openssl 代码调试

0x01 前言 最近在学习密码学&#xff0c;但是国密算法(SM2&#xff0c;SM3,SM4,SM9)的细节都在openssl项目里&#xff0c;当然一些国际算法也在。想着看下代码执行过程和理论结合起来。中间走了一些弯路&#xff0c;做个笔记。 0x02 openssl安装 一开始认为是不是直接下载好的…

Layui实现下拉多选功能

1、问题概述? 提供源码下载 在项目中有很多地方需要使用到下拉框,并且实现选择多个信息,下面是展示。 支持如下功能: 1、分页 2、主题自定义 3、国际化 4、下拉方向 5、Tips修改等 6、Style自定义样式 7、取值 8、赋值 2、资源准备及测试? 2.1、资源下载

Leetcode 力扣113. 路径总和 II (抖音号:708231408)

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

AIGC笔记--Stable Diffusion源码剖析之UNetModel

1--前言 以论文《High-Resolution Image Synthesis with Latent Diffusion Models》 开源的项目为例&#xff0c;剖析Stable Diffusion经典组成部分&#xff0c;巩固学习加深印象。 2--UNetModel 一个可以debug的小demo&#xff1a;SD_UNet​​​​​​​ 以文生图为例&#…

中山大学和字节发布「视频虚拟试穿」扩散模型VITON-DiT,一键生成换装后视频!

视频虚拟试穿技术日益受到关注&#xff0c;然而现有的工作局限于将服装图像转移到姿势和背景简单的视频上&#xff0c;对于随意拍摄的视频则效果不佳。最近&#xff0c;Sora 揭示了 Diffusion Transformer (DiT) 在生成具有真实场景的逼真视频方面的可扩展性&#xff0c;可以说…

Kubernetes入门-大简介

目录 何为微服务 何为云原生 何为编排器 “Kubernetes”这个名字来自希腊语&#xff0c;意思是“舵手”舵手是一个航海/航行术语&#xff0c;指掌舵的人从本质上说&#xff0c;Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator) 何为微服务 …