Codeforces Round 130 (Div. 2) E. Blood Cousins(LCA+DFS序+二分)【2100】
题目链接
https://codeforces.com/contest/208/problem/E
思路
此题有两个要点:第一,快速找到节点 u u u的 p p p级祖先。第二,在以节点 u u u为根的子树中找到与节点 u u u深度相同的节点的个数。
对于第一点,我们可以使用LCA算法在树上倍增,实现快速查询。
对于第二点,我们可以按照深度,将所有节点的DFS序全部存储到vector中,因为DFS序的单调性,直接二分查找即可。
时间复杂度: O ( n l o g 2 n ) O(nlog_{2}n) O(nlog2n)
代码
#include <bits/stdc++.h>using namespace std;#define int long long
#define double long doubletypedef long long i64;
typedef unsigned long long u64;
typedef pair<int, int> pii;const int N = 1e5 + 5, M = 1e2 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f3f3f3f3f;std::mt19937 rnd(time(0));int n, m;
int r[N];
struct LCA
{vector<vector<int>>mp;vector<int>depth;vector<int>L, R;vector<vector<int>>fa;vector<vector<int>>dep;int idx;LCA() {}LCA(int n) {init(n);}void init(int n){mp.resize(n + 1);depth.resize(n + 1);L.resize(n + 1), R.resize(n + 1);fa.resize(n + 1, vector<int>(20));dep.resize(n + 1);idx = 0;fill(depth.begin(), depth.end(), inf);}void add_edge(int a, int b){//建双向边mp[a].push_back(b);mp[b].push_back(a);}void dfs(int u, int fu){L[u] = ++idx;dep[depth[u]].push_back(L[u]);for (int j : mp[u]){if (j == fu) continue;dfs(j, u);}R[u] = idx;}void bfs(int root){depth[0] = 0, depth[root] = 1;queue<int>q;q.push(root);while (q.size()){int u = q.front();q.pop();for (int i = 0; i < mp[u].size(); i++){int j = mp[u][i];if (depth[j] > depth[u] + 1){depth[j] = depth[u] + 1;q.push(j);fa[j][0] = u;for (int k = 1; k <= 19; k++){fa[j][k] = fa[fa[j][k - 1]][k - 1];}}}}}int lca(int a, int b){if (depth[a] < depth[b]) swap(a, b);for (int k = 19; k >= 0; k -- )if (depth[fa[a][k]] >= depth[b])a = fa[a][k];if (a == b) return a;for (int k = 19; k >= 0; k -- )if (fa[a][k] != fa[b][k]){a = fa[a][k];b = fa[b][k];}return fa[a][0];}int find(int u, int len){for (int k = 19; k >= 0; k--){int res = 1ll << k;if (res <= len){len -= res;u = fa[u][k];}}return u;}
};
void solve()
{cin >> n;LCA tree(n);for (int i = 1; i <= n; i++){cin >> r[i];if (r[i]) tree.add_edge(i, r[i]);}for (int i = 1; i <= n; i++){if (!r[i])tree.bfs(i);}for (int i = 1; i <= n; i++){if (!r[i])tree.dfs(i, 0);}cin >> m;while (m--){int u, p;cin >> u >> p;if (tree.depth[u] <= p){cout << 0 << " ";}else{int zu = tree.find(u, p);int deep = tree.depth[u];int low = lower_bound(tree.dep[deep].begin(), tree.dep[deep].end(), tree.L[zu]) - tree.dep[deep].begin();int high = upper_bound(tree.dep[deep].begin(), tree.dep[deep].end(), tree.R[zu]) - tree.dep[deep].begin();high--;cout << high - low + 1 - 1 << " ";}}cout << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;// cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}
相关文章:
Codeforces Round 130 (Div. 2) E. Blood Cousins(LCA+DFS序+二分)【2100】
题目链接 https://codeforces.com/contest/208/problem/E 思路 此题有两个要点:第一,快速找到节点 u u u的 p p p级祖先。第二,在以节点 u u u为根的子树中找到与节点 u u u深度相同的节点的个数。 对于第一点,我们可以使用LC…...
RocketMQ原理—5.高可用+高并发+高性能架构
大纲 1.RocketMQ的整体架构与运行流程 2.基于NameServer管理Broker集群的架构 3.Broker集群的主从复制架构 4.基于Topic和Queue实现的数据分片架构 5.Broker基于Pull模式的主从复制原理 6.Broker层面到底如何做到数据0丢失 7.数据0丢失与写入高并发的取舍 8.RocketMQ读…...
LeetCode:343. 整数拆分
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 &#…...
【微服务与分布式实践】探索 Eureka
服务注册中心 心跳检测机制:剔除失效服务自我保护机制 统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期。当节点在短时间内丢失过多的心跳时&am…...
Golang Gin系列-9:Gin 集成Swagger生成文档
文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…...
技术发展视域下中西方技术研发思维方式的比较与启示
一、引言 1.1 研究背景与意义 在当今全球化的时代,科技发展日新月异,深刻地改变着人类的生活与社会的面貌。从人工智能的飞速发展,到生物科技的重大突破;从信息技术的广泛应用,到新能源技术的不断革新,技术…...
第4章 神经网络【1】——损失函数
4.1.从数据中学习 实际的神经网络中,参数的数量成千上万,因此,需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量,特征量指的是从输入数据/图像中提取出的本质的数 …...
Go的内存逃逸
Go的内存逃逸 内存逃逸是 Go 语言中一个重要的概念,指的是本应分配在栈上的变量被分配到了堆上。栈上的变量在函数结束后会自动回收,而堆上的变量需要通过垃圾回收(GC)来管理,因此内存逃逸会增加 GC 的压力࿰…...
StarRocks BE源码编译、CLion高亮跳转方法
阅读SR BE源码时,很多类的引用位置爆红找不到,或无法跳转过去,而自己的Linux机器往往缺乏各种C依赖库,配置安装比较麻烦,因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器,进行编…...
Vue 响应式渲染 - 待办事项简单实现
Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 待办事项简单实现 目录 待办事项简单实现 页面初始化 双向绑定的指令 增加留言列表设置 增加删除按钮 最后优化 总结 待办事项简单实现 页面初始化 对页面进行vue的引入、创建输入框和按钮及实例化V…...
SpringBoot基础概念介绍-数据源与数据库连接池
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…...
【面试】【前端】SSR与SPA的优缺点
一、SSR 概述 SSR(Server-Side Rendering)是指在服务器端生成 HTML 页面,并将其直接返回给浏览器的渲染方式。 在前端早期阶段,SSR 是主流,后来因性能优化和用户体验的需求逐渐发展出 SPA(单页应用&#x…...
Microsoft Visual Studio 2022 主题修改(补充)
Microsoft Visual Studio 2022 透明背景修改这方面已经有很多佬介绍过了,今天闲来无事就补充几点细节。 具体的修改可以参考:Microsoft Visual Studio 2022 透明背景修改(快捷方法)_material studio怎么把背景弄成透明-CSDN博客文…...
数科OFD证照生成原理剖析与平替方案实现
一、 引言 近年来,随着电子发票的普及,OFD格式作为我国电子发票的标准格式,其应用范围日益广泛。然而,由于不同软件生成的OFD文件存在差异,以及用户对OFD文件处理需求的多样化,OFD套餐转换工具应运而生。本…...
(done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?
由于操作系统和编译器约定了 ABI,如下: 编译器在对 C 语言编译时,会自动 caller 标注的寄存器进行保存恢复。保存的步骤通常发生在进入函数的时候,恢复的步骤通常发生在从函数返回的时候。 内核线程切换需要保存的寄存器&#…...
9. 马科维茨资产组合模型+FF5+GARCH风险模型优化方案(理论+Python实战)
目录 0. 承前1. 核心风险函数代码讲解1.1 数据准备和初始化1.2 单资产GARCH建模1.3 模型拟合和波动率预测1.4 异常处理机制1.5 相关系数矩阵计算1.6 构建波动率矩阵1.7 计算协方差矩阵1.8 确保矩阵对称性1.9 确保矩阵半正定性1.10 格式转换和返回1.11 calculate_covariance_mat…...
Linux 多路转接select
Linux 多路转接select 1. select select() 是一种较老的多路转接IO接口,它有一定的缺陷导致它不是实现多路转接IO的最优选择,但 poll() 和 epoll() 都是较新版的Linux系统提供的,一些小型嵌入式设备的存储很小,只能使用老版本的…...
最近最少使用算法(LRU最近最少使用)缓存替换算法
含义 最近最少使用算法(LRU)是一种缓存替换算法,用于在缓存空间有限的情况下,选择最少使用的数据项进行替换。该算法的核心思想是基于时间局部性原理,即刚被访问的数据在未来也很有可能被再次访问。 实现 LRU算法的…...
信息学奥赛一本通 1342:【例4-1】最短路径问题
【题目描述】 平面上有n个点(n<100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是…...
【实践案例】使用Dify构建文章生成工作流【在线搜索+封面图片生成+内容标题生成】
文章目录 概述开始节点图片封面生成关键词实时搜索主题参考生成文章详情和生成文章标题测试完整工作流运行测试结果 概述 使用Dify构建文章生成工作流,使用工具包括:使用 Tavily 执行的搜索查询,使用Flux生成封面图片,使用Stable…...
MyBatis 写法
MyBatis 高效使用技巧 常见 MyBatis 使用技巧,这些技巧有助于简化数据库操作,提高开发效率,并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句,避免了手动拼接字符串带来的复杂性和错误风险。…...
Web3 如何赋能元宇宙,实现虚实融合的无缝对接
随着技术的飞速发展,元宇宙作为一个未来数字世界的概念,正在吸引全球范围内的关注。而 Web3 技术的兴起,为元宇宙的实现提供了强大的支撑。Web3 是基于区块链技术的去中心化网络,它在改变互联网的同时,也推动着虚拟世界…...
C#常考随笔3:对象比较obj1.Equals(obj2)== true时候,hashcode是否相同?
一般情况下是相同的,但在自定义类型中,重写了Equals方法,就可能不同。 Equals: 1. 首先,关于Equals方法: Equals 方法最初定义在 Object 类中,所有的类都直接或间接地继承自 Object 类&#…...
深入探索SQL中修改表字段属性的技巧与策略
摘要 在SQL中,修改表字段属性是一项常见的数据库管理任务。用户可以调整字段的数据类型、长度、默认值或注释,而无需更改字段名称。例如,varchar类型可转换为mediumtext或text,NVARCHAR2类型可转换为NCLOB。若需同时变更字段名称及…...
gif动画图像优化,相同的图在第2,4,6帧中重复出现,会增加图像体积吗?
对于 GIF 图像,情况与 Git 文件存储有所不同。GIF 是一种图像格式,其体积主要取决于图像的内容、颜色数量、优化设置等因素。如果在 GIF 动画中,相同的图像在第 2、4、6 帧中重复出现,是否会增加图像体积,取决于以下几…...
LangChain的开发流程
文章目录 LangChain的开发流程开发密钥指南3种使用密钥的方法编写一个取名程序 LangChain表达式 LangChain的开发流程 为了更深人地理解LangChain的开发流程,本文将以构建聊天机器人为实际案例进行详细演示。下图展示了一个设计聊天机器人的LLM应用程序。 除了Wb服务…...
电商系统-用户认证(四)Oauth2授权模式和资源服务授权
本文章介绍:Oauth2.0 常见授权模式,资源服务授权 。 准备工作 搭建认证服务器之前,先在用户系统表结构中增加如下表结构: CREATE TABLE oauth_client_details (client_id varchar(48) NOT NULL COMMENT 客户端ID,主…...
[答疑]DDD伪创新哪有资格和仿制药比
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 远航 2025-1-24 10:40 最近的热门话题仿制药,想到您经常批评的伪创新,这两者是不是很像? UMLChina潘加宇 伪创新哪有资格和仿制药比。 仿制药的…...
图漾相机——Sample_V1示例程序
文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…...
系统架构设计师教材:信息系统及信息安全
信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段,即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则:只有高层管理人员才能知道企业究竟需要什么样的信…...
