FA 科技:一种基于换根 + DFS 序的点分治下下位替代

news/2024/11/16 20:11:05/文章来源:https://www.cnblogs.com/FracturedAngel/p/18549757

起因:cjx 暑假集训的时候出了道题,老师说可以点分治。但是我最初的想法其实是换根处理,但怎么想发现都行不通,因为要同时维护 DFS 序和权值。于是就没想了。后来 10.5 和 xyh 进行长达 30s 的讨论 导游的工作 那题,说了我这个想法,xyh 觉得有道理,对要求解的问题具体化,于是我才想出了分块这一数据结构。并在 xyh 的指导下进行卡常。但其实这个方法已经被发明过了。Tree 那道题的题解里有提到过。

这个方法的复杂度是 \(O(n\times P)\),其中 \(P\) 为一个多项式,代表你使用的数据结构的复杂度。也就是说,如果你的 \(P\) 可以足够好,这个方法甚至可以是点分治的平替。

例题 1:BNDSOJ 1502 导游的工作

Method 1:暴力换根

我们钦定 \(1\)\(n\) 中的每一个点为根。对于每一个根 \(u\) 算出整个树上每个点的深度,判断有多少个点的深度小于等于 \(c\) 即可。这是显然的,时间复杂度为 \(O(n^2)\)

Method 2:分块优化换根

基本的思想还是 暴力统计。我们只是在用数据结构强行优化这个暴力。

考虑 树上换根动态规划 的思想。统计每个点的答案贡献。前提是你对换根法有了较为深刻的理解。但我们知道,如果把根从 \(u\) 换到儿子 \(v\),每个点的深度都会随之改变。而且这个改变关于原来点的编号不连续。但好消息是,我们在这里并不关注原先的点的编号是什么。

那我们怎样快速修改这个“不连续”的区间呢?如果你知道 树链剖分。那你一定知道它的下位替代—— DFS 序线段树 吧。其实就是根据 子树的 DFS 序连续 这一特性,把不连续的编号转化为连续的 DFS 序进行修改。在这一题里也同样是这么使用的。

但是这题我们并不能使用线段树。因为我们要的操作是这两种:

  1. 区间加减 \(w\)
  2. 全局询问小于等于 \(c\) 的 depth 的个数

其实第二个的全局我们可以加强成区间。你会发现这个东西基本等价于 P2801 教主的魔法。于是我们可以使用 分块 维护。

于是时间复杂度为 \(O(n \times P) = O(n\log n \sqrt{n} )\)

例题 2:P3806 【模板】点分治 1

这个因为时限卡的过死于是不能满分,虽然说暴力也可以那道 60 pts,但是我想说这个换根的方法是远优于暴力的。

这个题其实和上面那个题没有本质区别。还是换根,然后询问全局有没有等于 \(c\) 的数,依然可以块内二分解决。

最主要的不同就是把询问离线下来,每次换根的时候都处理一次 \(Q\) 个询问即可。

例题 3:P4178 Tree

这个就纯纯与导游的工作那题没有任何区别,所以我认为导游的工作那题也是紫。

就是把求最大变成全局统计小于等于 \(k\) 的点对了啊。

注意如果换根统计出来的答案是 \(ans\),则真正的答案应该为 \(\frac{ans-n}{2}\)

例题 4:P2634 [国家集训队] 聪聪可可

稍微变一下形,这题的复杂度是 \(O(n\sqrt{n})\),因为没有块内排序和块内二分。

就是询问树上边权和为 \(3\) 的倍数的路径数。考虑每一块维护三个值。分别代表深度模 \(3\)\(0,1,2\) 的个数。然后每次加 \(w\) 或减 \(w\),其实就相当于加 \(0/1/2\)。加 \(0\) 不用管,加 \(1/2\) 就相当于模 \(3\)\(0,1,2\) 的个数互相交换。

注意散块的处理要尤为注意,就是因为散块,我们还要维护一个区间加再模 \(3\) 的 tag。修改的时候散块也是最麻烦的。

主要难点都是在分块。换根本身没啥难的。

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

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

相关文章

书生共学大模型实战营第4期 L1G6000 OpenCompass评测作业

基础任务:使用OpenCompass评测浦语API记录复现过程并截图 按照教程流程进行,这里我们采用的测试样本数为2,所以不同于教程,Acc可能为0,25%,50%,75%,100%,介绍两个遇到的bug:metadata模块导入错误:ModuleNotFoundError: No module named importlib.metadata解决方法:…

ShardingSphere如何轻松驾驭Seata柔性分布式事务?

0 前文 上一文解析了 ShardingSphere 强一致性事务支持 XAShardingTransactionManager ,本文继续:讲解该类 介绍支持柔性事务的 SeataATShardingTransactionManagersharding-transaction-xa-core中关于 XAShardingTransactionManager,本文研究 XATransactionManager 和 Shar…

20222303 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1 本周学习内容回顾 使用了Metasploit框架,其是一个功能强大的渗透测试框架。在使用的过程当中,Metasploit 提供了种类繁多的攻击模块,涵盖了远程代码执行、服务拒绝、提权等多种攻击方式,支持对多种操作系统和应用程序进行测试。除了漏洞利用,它还具备强大的…

20222325 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式;该域名对应IP地址;IP地址注册人及联系方式;IP地址所在国家、城市和具体地理位置。 PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线…

识海社区打卡-6

这场掉回灰名了,本来必然上大分,原因无他-查寝 先来查波战绩:c题没过纯属是因为被查寝查了室友也是个不知变通的让查寝记我头上了,byd害我赶回去,本来这题必出 看看我最后一发提交错哪了 void solve() {int n;cin >> n;if (n % 2){if (n < 27){cout << -1 …

第七次高级程序语言设计作业

班级:https://edu.cnblogs.com/campus/fzu/2024C 作业要求:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400115 姓名:洪育豪 7.1问题:无7.2问题:无7.3问题:无7.4问题:无 含义说明 int a; - 定义一个普通整型变量。 int a; - 定义一个指向整型变量…

工具“dotnet-cnblog”安装失败。此故障可能由以下原因导致

工具“dotnet-cnblog”安装失败。此故障可能由以下原因导致解决方法 我这边用的wifi 有问题,换到手机热点就好了。本文来自博客园,作者:lanwf,转载请注明原文链接:https://www.cnblogs.com/lccsdncnblogs/p/18549701

idea免费激活到2099年

idea免费激活到2099年 目录idea免费激活到2099年前言一去官网上下载idea二 下载idea激活工具并使用第一步点击scripts(uninstall-all-users.vbs)清除信息第二步点击(install.vbs)安装配置信息第三步打开(idea.vmoptions)拷贝配置信息到 idea配置中三激活idea1复制激活码 …

学期:2024-2025-1 学号:20241303 《 计算机基础与程序设计》第八周学习总结

作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第八周作业)这个作业的目标 <写上具体方面> 计算机科学概论(第七版)第9章 并完成云班课测试,《…

DM multipath总结---基于LINUX 7

DM multipath总结---基于LINUX 7 DM multipath总结DM Multipath提供的功能: 冗余:DM Multipath 能够在主动/被动配置下提供故障转移。在主动/被动配置下,只有一半的路径在每次进行 I/O 时会被使用。若一条 I/O 路径的任一元素(电缆、交换器或者控制器)出现故障,DM Multi…

如果让你来设计网络

如果让你来设计网络 你是一台电脑,你的名字叫 A 很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。 ​​ 直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根网线连接了起来。 ​​ 用一根网线连接起来怎么就能"通信"了呢?我可以给你讲…

Wincc 7.5SP1下VBA编程练习:批量设置看见权限

这一篇学习笔记我在新浪发表过,那边还在审核。在这里也记录一下。 前两天QQ群里面有人询问能不能快速的给WINCC画面上的控件设置操作权限,这个是比较容易的。比如有个画面有10个IO域,在VBA编辑器写下面的脚本:Sub IOField_PropertyTrigger1() Dim objects Dim obj Dim objd…