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

Oracle Linux中/var/log/pcp/pmlogger目录膨胀问题分析与解决 本文详细分析了Oracle Linux系统中/var/log/pcp/pmlogger目录异常膨胀的常见原因与解决方案。当PCP性能监控框架的pmlogger服务日志轮转或清理机制失效时,会导致该目录无限增长,威胁系统稳定。文章提供了从服务状态诊断、配置文件审查到安全清理与预防策略的全流程实战指南,帮助运维人员快速回收磁盘空间并恢复服务正常运行。 阅读详情

暗的连锁

题目描述

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 1≤N≤105,1≤M≤2×105。数据保证答案不超过 2 31 − 1 2^{31}−1 231−1。

原题

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]+1,dif[v]+1,dif[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) // 此时删去主要边即可破坏整张图,所以任意选择一条次要边都满足条件,贡献为m
            ans += m;
        if (tree.dif[i] == 1) // 此时删去主要边后必须删去连通两点的唯一次要边,贡献为1
            ans++;
        // 当除去直接相连的主要边之外的路径个数大于1时,删去该主要边和任意一条次要边都无法破坏整张图,贡献为0
    }
    cout << ans << '\n';

    return 0;
}
Altium Designer 21 DRC检查:从新手到高手,这10个常见错误你踩过几个? 本文详细解析Altium Designer 21 DRC检查中的10个高频错误,包括间距违规、线宽违规、未连接网络等常见问题,并提供精准修复方案和实战技巧。通过分层诊断、智能规则设置和三维排查等方法,帮助工程师从新手进阶为高手,提升PCB设计效率和质量。 阅读详情

相关推荐

实战指南!基于STM32的智能环境监测系统(代码+硬件设计+云端控制)

本文详细介绍了基于STM32的智能环境监测系统的设计与实现,包括硬件选型、电路设计、软件架构和云端控制。系统通过DHT11温湿度传感器和MQ-2烟雾传感器实时监测环境数据,STM32F103C8T6主控芯片处理数据并通过ESP8266上传至中国移动物联网平台,支持手机APP远程监控。项目成本低、稳定性高,适合智能家居和环境监测应用。

weixin_29194817的博客 433

「一本通 4.4 例 2」暗的连锁(LOJ 10131)

QWQ 看这里! 原题来自:POJ 3417(点不开的) Dark 是一张无向图,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有N–1条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有M条附加边。 你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边...

ccx20060313的博客 1032

90+个各种疾病相关医疗数据集

含新冠、传染病、医学图像等

2万+

「一本通 4.4 例 2」暗的连锁 题解

题目传送门 题目大意: 给一棵由白边连接的树,里面还有若干条黑边,问有多少种黑边和白边各删除一条后使图不连通的方案。 题解 我这可能是全网绝无仅有的沙雕做法了…… 正解: 倍增 +++ 树上差分。 然而我一开始的想法就偏离了正轨…… 我的解法: dfsdfsdfs 序 +++ splaysplaysplay +++ 启发式合并 考虑每一条白边,假如将它删掉之后,再删一条黑边可以使得这棵树不连通,当...

a_forever_dream的博客 556

VOF模型求解方法:从SIMPLEC到PISO的稳定性优化策略

本文深入探讨了VOF模型求解方法中SIMPLEC与PISO算法的稳定性优化策略,重点分析了两种算法在稳态和瞬态问题中的应用差异。通过对比PRESTO离散化方法与其他格式的优劣,提供了针对多相流模拟的实用设置建议和稳定性优化技巧,帮助工程师有效提升计算效率和精度。

yellow的专栏 1154

告别云端依赖:手把手教你在Windows 10/11上离线部署WhisperDesktop(含模型下载避坑指南)

本文详细介绍了如何在Windows 10/11上离线部署WhisperDesktop,包括硬件要求、模型下载、环境配置和实战应用。通过本地部署,用户可以实现高效的语音转文字功能,无需依赖云端服务,特别适合注重数据隐私和需要离线工作的场景。

weixin_33736048的博客 322

LOJ #10131 「一本通 4.4 例 2」暗的连锁

LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10^5 , m \le 2*10^5 $ , 保证答案在 \(int\) 范围内. 对于每条非树边 , 覆盖 \(x\) 到 \(LCA\) 和 \(y\)到 \(LCA\) 的边 , 即差分算出每个点...

weixin_30906425的博客 207

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 790

LOJ #10131. 「一本通 4.4 例 2」暗的连锁 解题报告

文章目录题目链接解题思路详细代码 突然发现自己不会树上差分 是不是应该恶补一波? 题目链接 LOJ #10131. 「一本通 4.4 例 2」暗的连锁 解题思路 我们发现,主要边就构成了一棵树。接下来我们考虑附加边对树的影响。 对于一条附加边(u,v),我们发现,如果我们选择切断路径(u~v)上的一条主要边,那么接下来必须要切断这条附加边。 我们可以完美地把这个问题转换为树上覆盖问题。 每一条...

日居月诸的博客 459

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3600

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1686

信息学奥赛一本通 1553:【例 2】暗的连锁

本文研究了如何通过切断一条主要边和一条附加边使连通图不连通的问题。通过将主要边构成的树结构进行树上边差分处理,统计每条边参与环的数量。对于权值为0的边,切断后可以任意选择附加边;权值为1的边则必须切断对应的附加边;权值大于1的边无法实现目标。算法使用LCA和树上差分技术,时间复杂度为O(nlogn)。最终方案数即为满足条件的主要边与对应附加边的组合数。

君义NOIP的博客 1264

一文掌握 MongoDB 详细安装与配置(Windows / Linux / macOS 全平台)

本文详细介绍了MongoDB社区版7.0+在Windows、Linux和macOS三大操作系统上的完整安装、配置与安全加固流程。主要内容包括:各平台推荐安装方式(Windows使用MSI安装包、Linux通过官方仓库、macOS通过Homebrew)、基本配置参数说明、服务启动方法以及关键安全措施(如创建管理员用户和启用身份验证)。文章还提供了系统最低要求、下载地址、数据目录设置建议以及生产环境使用注意事项,适合开发、测试及生产环境部署参考。

数据知道的博客 6715

LibreOJ #10131 暗的连锁(转换题意+树上差分--解决边覆盖)

题目链接:https://loj.ac/problem/10131 题意转化: “主要边”构成一棵树,“附加边”则是“非树边”。 把一条附加边(x,y)添加到主要边构成的树中,会与树上x,y之间的路径一起形成一条环。 称为:每条附加边(x,y)都把树上x,y之间的路径上的每条边“覆盖了一次” 转化为的问题模型: 给定一个无向图和一颗生成树,求每条“树边”被“非树边”覆盖了多少次? 引入树上差分算...

zaiyang遇见 320

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

暗的连锁 题解(问题转化+树上差分+LCA倍增)

暗的连锁 树上差分 保姆级分析讲解

2401_84512298的博客 1051

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LOJ #10131. 「一本通 4.4 例 2」暗的连锁

analysis 这是一道好题诶!对于我这种蒟蒻来说是属于比较考思维的一道题 开始看到题一脸懵逼,根本不知道从何下手 看到书上的讲解后才恍然大悟:原来就是个差分嘛! 我们枚举每条非树边(x,y),把x到y路径上所有边的边权+1,对于每条树边,如果边权为0,则切断它之后原图已经不联通,第二条边随便切一条,共m种方案。如果边权为1,则第二步必须切断对应的那条边,方案数1,如果边权大于2则没有方案。 ...

AndrewLi的博客 388

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【题解】【POJ3417】暗的连锁【LCA+树上差分】

题目描述 原题来自:POJ 3417 Dark 是一张无向图,图中有n个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有m条附加边。 你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark 就...

Zbw_OIer的博客 1233

#10012. 「一本通 1.2 例 2」Best Cow Fences 【 二分答案 】【 巧妙 】

  样例输入: 10 6 6 4 2 10 3 8 5 9 4 1 样例输出: 6500 将原问题转化为: 判定 " 是否存在一个长度不小于L 的区间,区间的平均数不小于二分的值 " 精度问题,请注意! AC代码: //是否存在一个长度不小于L的区间,使得平均数不小于二分的值 #include &lt;cstdio&gt; #include &lt;cstring&gt...

violinwang 971

LOj10131 暗的连锁

题目描述 原题来自:POJ 3417 Dark 是一张无向图,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M条附加边。 你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条...

juruo_xlh 1270

暗之连锁——解题报告

题目链接:http://172.18.70.217/problem/20。 题目大意:删掉两条边,一条必要边,一条附加边。必要边能构成一棵树。求有多少种方案可以使这个图不联通。必要边N条,附加边M条。 首先我们知道,暴力枚举两条边,再判断是否联通,复杂度为O(n^2 * m).枚举一条边后求图中桥的个数,复杂度为O(n * m)。所以我们需要更快的算法。 通过分析题意我们知道,其实对于一个树...

风中的微尘的博客 756

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 250

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 346

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 86

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 306

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 448
上一篇: 洛谷 P5043 【模板】树同构([BJOI2015]树的同构)题解 树哈希 树的重心
下一篇: 洛谷 B3609 [图论与代数结构 701] 强连通分量 题解 tarjan算法
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值