B. 树上的回忆 (memory) 题解

news/2025/1/7 9:55:56/文章来源:https://www.cnblogs.com/cqyc-sol/p/18653485

\(dis(i,j)\) 有两种转换方式,第一种是统计每条边被经过了多少次,第二种是变成 \(\sum_{i=l}^{r} \sum_{j=l}^{r} dep(lca(i,j))\)。这里采用第二种(因为第一种寄了)。

先考虑暴力,采取换根 DP:把 \([l,r]\) 建一棵虚树。对于一个点 \(x\) 尝试计算 \(\sum_{y} dep(lca(x,y))\)\(y\) 分成两部分,是 \(x\) 的子孙以及不是 \(x\) 的子孙。前者是好算的。对于后者,记 \(f_{x} = \sum_{y 不是x的子孙} dep(lca(x,y))\),从上往下换根 DP 计算即可。

所以现在我们能做到:\(O((|S|+|T|) \log (|S|+|T|))\) 对于每个满足 \(i \in S\)\(i\) 求出 \(\sum_{j \in T} dis_{i,j}\)

尝试使用分块。答案有三部分(以下时间复杂度分析均不考虑排序的 \(\log\),后文有解决方法):

  • 散块与散块的点:暴力即可。这部分时间复杂度为 \(O(qB)\)\(B\) 为块长。
  • 整块与整块的点:预处理 \(f_{x,y}\) 表示 \(\sum_{i \in S} \sum_{j \in T} dis_{i,j}\)。这部分时间复杂度为 \(O(\frac{n^2}{B})\)
  • 整块与散块的点。预处理 \(Pre_{v,x}\) 表示 \(\sum_{i \in [begin_{v},v]} \sum_{j \in [1,第x个块]}dep(lca(i,j))\)。其中 \(begin_{v}\) 表示 \(v\) 所属的块的起始位置。再预处理 \(Suf_{v,x}\) 表示 \(\sum_{i \in [v,end_{v}]} \sum_{j \in [1,第x个块]}dep(lca(i,j))\)。其中 \(end_{v}\) 表示 \(v\) 所属的块的起始位置。这实际上就是两个前缀和。这其实也是好算的。对同一块的 \(Suf\) 一起算,对同一块的 \(Pre\) 一起算。这部分时间复杂度应该是 \(O(\frac{n^2}{B})\)。但是会超空间,但是很明显我们不需要存下来,离线一下,算到哪给哪个询问的答案加上贡献就好了。

瓶颈在于建虚树时的排序,解决方法也很简单,给每块都先按照 dfn 排序,然后算两块之间时归并一下,排序就不带 \(\log\) 了。要用到欧拉序求 LCA。

\(B = \sqrt n\),时间复杂度为 \(O((n +q)\sqrt{n})\)

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

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

相关文章

CPU负载均衡之WALT

前言 本文继续整理CPU调度WALT相关内容,主要整理如下内容:WALT是什么? WALT 计算? WALT 计算数据如何使用?1. WALT是什么? WALT:Windows-Assist Load Tracing的缩写:从字面意思来看,是以window作为辅助项来跟踪CPU LOAD; 实质上是一种计算方法,用数据来表现CPU当前的…

[ Netty ] 通过Netty聊天业务来加深理解Netty运行以及网络编程.

引言这几天在学习Netty网络编程的过程当中对Netty的运作原理及流程有一定的了解,通过Netty实现聊天业务来加深对Netty的理解.这里用一张图概括运行流程这里我在Github上面找到一位大神总结的尚硅谷的学习笔记,里面有写Netty的运作原理(但是因为前面一直在讲原理我自己身原因容易…

输出下列图形

题目很简单但也算是复习知识点,有三种做法,第一种是直接printf,第二种是循环语句,第三种是调用函数。printf省略 for循环: ① ②调用函数:

动手深度学习-PyTorch(第二版)PDF、EPUB免费下载

李沐,动手深度学习,中文第二版,2023年8月18日。本书是《动手学深度学习》的重磅升级版本,选用经典的PyTorch深度学习框架,旨在向读者交付更为便捷的有关深度学习的交互式学习体验。 本书重新修订《动手学深度学习》的所有内容,并针对技术的发展,新增注意力机制、预训练等…

Python数据结构与算法分析 第3版PDF、EPUB免费下载

只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡!适读人群 :1. 希望学习数据结构和算法的Python用户; 2. 计算机专业的学生和老师。 只有洞彻数据结构与算法,才能真正精通Python!热…

《计算机组成及汇编语言原理》读后感

一、 为什么选择这本书? 这本书来自于:https://github.com/codefollower/My-Blog/issues/1。工作之后,个人一直追求的一个方面就是“系统化”,笼统的来说就是从以下两方面进行系统化:“基础”+“专业”。这本书属于基础方面的深化,通过 Java 虚拟机来讲计算机组成。 二、…

Effective Java中文版(原书第3版)PDF、EPUB免费下载

Jolt获奖作品全新升级,与《Java编程思想》和《Java核心技术》齐名,针对Java7、8、9全面更新Effective Java中文版(原书第3版)PDF、EPUB免费下载 适读人群 :本书并非面向Java初学者,而是要求读者有一定的Java编程经验。对于在Java开发方面已经积累一定经验的读者而言,本书…

2024-2025-1 20241301 《计算机基础与程序设计》第十五周学习总结

|这个作业属于哪个课程|2024-2025-1-计算机基础与程序设计| |这个作业要求在哪里|2024-2025-1计算机基础与程序设计第一周作业| |这个作业的目标|<复习知识,巩固基础>| |作业正文|https://www.cnblogs.com/HonJo/p/18653443| 一、教材学习内容 (一)《计算机科学概论》…

剖析Vue2内部运行机制

Vue.js 运行机制全局概览 全局概览 这一节笔者将为大家介绍一下 Vue.js 内部的整个流程,希望能让大家对全局有一个整体的印象,然后我们再来逐个模块进行讲解。从来没有了解过 Vue.js 实现的同学可能会对一些内容感到疑惑,这是很正常的,这一节的目的主要是为了让大家对整个流…

C++前缀和

有一个数组{2,1,3,6,4},询问三次结果: a[5] = {2, 1, 3, 6, 4} 1.数组第1到第2个元素的和是多少? 2. 数组第1到第3个元素的和是多少? 3. 数组第2到第4个元素的和是多少?没有用前缀和的原始用法:1 #include<iostream>2 #include<stdio.h>3 using namespace st…

Verilog6_串行通信协议

Verilog内容总结6_串行通信协议一、通信协议概述 1.串行通信与并行通信串行通信(serial communication):数据通过单根数据线一位一位地传输;成本低但速度慢;适用于远距离传输,用于计算机与外设之间,如UART、\(I^2C\)、SPI并行通信(parallel communication):通过多根数…

二进制码与格雷码之间的转换

二进制码到格雷码的转换 (1)格雷码的最高位(最左边)与二进制码的最高位相同。 (2)从左到右,逐一将二进制码相邻的两位相加(舍去进位),作为格雷码的下一位。格雷码到二进制码的转换 (1)二进制码的最高位(最左边)与格雷码的最高位相同。 (2)将产生的每一位二进制…