【p3128、LQB14I砍树】树上差分

news/2025/3/16 6:08:54/

文章目录

  • 差分
  • 树上差分
  • p3128
  • LQB14I砍树
    • 题目
    • 解题步骤
    • 代码样例

差分

差分数组求法:
设原始数组是arr,差分数组是b

  • b[0] = arr[0];
  • b[i] = arr[i] - arr[i-1];

在这里插入图片描述
如果我们要对图中2-4区间的数每个都加上3,就可以在差分数组2的位置加上3,在差分数组4的后一个元素即5的位置减去一个3(目的是消除3对后面区间的影响),再对差分数组前缀和即可完成。

树上差分

多次对树上路径做加法操作,然后询问对某个点操作后的值,适用树上差分。

差分数组求法:

  • 叶子节点的差分值是叶子节点的权重
  • 其他节点的差分值是权-子权和

在这里插入图片描述

  • 权 = 差分值 + 子权和

p3128

LQB14I砍树

题目

题目信息:
给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2),
. . . , (am, bm),其中 ai 互不相同,bi 互不相同,ai ≠ bj(1 ≤ i, j ≤ m)。
小明想知道是否能够选择一条树上的边砍断,使得对于每个 (ai , bi) 满足 ai和 bi 不连通,如果可以则输出应该断掉的边的编号(编号按输入顺序从 1 开始),否则输出 -1.

输入输出:
输入共 n + m 行,第一行为两个正整数 n,m。
后面 n − 1 行,每行两个正整数 xi,yi 表示第 i 条边的两个端点。
后面 m 行,每行两个正整数 ai,bi。

一行一个整数,表示答案,如有多个答案,输出编号最大的一个。

输入:
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5
4

输出:
4

解题步骤

  1. 要使砍掉一条边后每一数对都不连通,就要让所有数对都经过这条边。
  2. 将边权下移到点上,对x和y两点间的操作变为:s[x]++;s[y]++;s[LCA(x,y)]-=2;(其中s是差分数组)。
  3. 操作完成后,如果有边的权值恰好等于m,更新答案。

代码样例

#include <bits/stdc++.h>
using namespace std;const int N = 1e5+5;int n,m,dep[N],fa[N][21],ans,s[N];vector<int> e[N],num[N];void dfs(int u,int father){dep[u] = dep[father] + 1;fa[u][0] = father;for(int i = 1;i<=20;i++){fa[u][i] = fa[fa[u][i-1]][i-1];}for(int i = 0;i<e[u].size();i++){int v = e[u][i];if(v == father) continue;dfs(v,u);}
}int LCA(int u,int v)
{if(dep[u] < dep[v]) swap(u,v);for(int i = 20;i>=0;i--){if(dep[fa[u][i]] >= dep[v]) u = fa[u][i];}if(u == v) return u;for(int i = 20;i>=0;i--){if(fa[u][i] != fa[v][i]) u = fa[u][i] , v=fa[v][i];}return fa[u][0];
}void dfs2(int u,int Fa)
{for(int i = 0;i<e[u].size();i++){int v = e[u][i], p = num[u][i];if(v == Fa) continue;dfs2(v,u);s[u] += s[v];if(s[v] == m) ans=max(ans,p);}
//	if(s[u] == m) ans=max(ans,p);
} int main()
{cin >> n >> m;for(int i = 1;i<n;i++){int x,y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);num[x].push_back(i);num[y].push_back(i);}	dfs(1,0);	//差分for(int i = 1;i<=m;i++){int a,b;cin >> a >> b;s[a]++;s[b]++;s[LCA(a,b)]-=2;} //统计结果 dfs2(1,0);cout << ans << endl;return 0;
}
文章来源:https://blog.csdn.net/m0_73209194/article/details/136463665
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/1373694.html

相关文章

CVE-2024-25600 WordPress Bricks Builder RCE-漏洞分析研究

本次代码审计项目为PHP语言&#xff0c;我将继续以漏洞挖掘者的视角来分析漏洞的产生&#xff0c;调用与利用..... 前方高能&#xff0c;小伙伴们要真正仔细看咯..... 漏洞简介 CVE-2024-25600 是一个严重的&#xff08;CVSS 评分 9.8&#xff09;远程代码执行 (RCE) 漏洞&am…

索引类型介绍

4、说说你知道的MySQL的索引类型&#xff0c;并分别简述一下各自的场景。 普通索引&#xff1a;没有任何限制条件的索引&#xff0c;该索引可以在任何数据类型中创建。 唯一索引&#xff1a;使用UNIQUE参数可以设置唯一索引。创建该索引时&#xff0c;索引列的值必须唯一&…

2022 年 9 月青少年软编等考 C 语言一级真题解析

目录 T1. 指定顺序输出思路分析 T2. 成绩判定思路分析 T3. 简单排序思路分析 T4. 数字求和思路分析 T5. 数 1 的个数思路分析 T1. 指定顺序输出 依次输入 3 3 3 个整数 a a a、 b b b、 c c c&#xff0c;将他们以 c c c、 a a a、 b b b 的顺序输出。 时间限制&#xff1…

RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢&#xff1f; RabbitMQ在接收到消息后&#xff0c;默认并不会立即进行持久化&#xff0c;而是先把消息暂存在内存中&#xff0c;这时候如果MQ挂了&#xff0c;那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…

django 的 filter 使用技巧

参考&#xff1a; https://blog.csdn.net/CaiTong_/article/details/122329450 django QuerySet 初始化 在Django中&#xff0c;可以使用QuerySet来进行数据库查询。要初始化一个QuerySet对象&#xff0c;需要先导入相应的模型类&#xff0c;然后通过该模型类创建一个空的Que…

蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)

站位巨人的肩膀上继续加油!借鉴卫东上老师的蓝牙视频教程学习中。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现…

IntelliJ IDEA分支svn

IntelliJ IDEA分支svn 【为何使用分支】 项目开发中经常会遇到这种情况&#xff0c;项目中功能开发完上线后&#xff0c;新的需求又来了&#xff0c;风风火火的在项目里开发&#xff0c; 突然有一天测试说有个很致命的bug需要紧急修改上线&#xff0c;完蛋了&#xff0c;原来…

Vue3使用reactive定义的响应式变量 用计算属性监听这个变量不会实时更新,需要定义ref才行

在 Vue 3 中&#xff0c;如果你使用 reactive 创建响应式对象&#xff0c;然后在 computed 中使用这些响应式对象&#xff0c;确实可能会出现计算属性不会实时更新的情况。这是因为 computed 默认情况下只会在它所依赖的响应式变量被访问时才会重新计算&#xff0c;而不会在这些…