点分治经典_动态点分治

HYSBZ_3730_震波

背景:这是接触的动态点分治第一题,开始不是很理解,看了很久,写了很久才理解了动态的动态所在。
前置知识:静态点分治(主要是容斥思想,一般看出来是点分治的话,想到怎么容斥剩下的操作就很机械了,还有一种LCT,目前是我的盲区),线段树(树状数组)。可以通过写一写线段树和树状数组的题来理解这两个维护的有力工具。
题目描述:给出一棵树,第一种操作:在x点(编号,非权值)发生y长度地震,距离x不超过y的点全部被摧毁,求被摧毁的权值总和;第二种操作:将x的权值改为y。其中摧毁独立,修改不独立。
动态点分治模板题,一开始当静态的做,已经自闭了,怎么都想不出来点分治还能修改,要不是做专题,还以为是树链剖分,可是好像又不对,苦想无果,打开百度。。

浅谈点分治:
其一:点分治本质还是分治,分治就是不断将大区间划分成小区间,小到可以简单解决再向上合并。而动态点分治和静态最大的区别就是他是动态的废话,那么要在动态中高效求解,就想到了数据结构。可是数据结构要维护,要有数据,点分治的数据(仅本题)是点权,显然维护点权即可,但是怎么维护较为合理?这时候就要牵扯到一点静态点分治的思想了,我们考虑任意点u:①如果是初始重心(无向树中,最大子树规模最小的点),显然只会被分治0次,然后更新多次。②如果是叶子,显然会被分治多次,更新一次。③中间节点:分治次数与更新次数基于前两者中间。这里说的分治次数,指的是该点会出现在其祖先后代中的次数(显然初始重心没有确切存在的祖先,只有虚根0,故其不会出现在任何>0的编号的分治之下),更新次数指的是若该点的后代被修改,他也会被更新。(因为本题求的是和值,单点更新之后,自然向上合并的时候和值会被更新)。
其二:个人觉得最关键的一点,就是一旦一棵树你输入完了,点分治的顺序其实已经是确定的了,这也就是能用数据结构维护的原因。意思就是说每个点被分治的次数是可以求出来的,某一个点分治时的各种关系是确定的,自然向上合并的时候也是确定的。于是乎我们可以为每个点开两个树状数组(本题需要两个)。

题解:对于每个点,在getrt之后,确定下来关系(getship),这里的关系指的是:①他被分治的次数(ct[i]=j, 表示i这个点一共被分治j次)。②他在每次被分治时,距离当前重心的距离以及当前重心(dis[i][j]=k,i点在第j次被分治时距离该次重心的距离为kfa[i][j]=ki点在第j次分治的重心是k)。③每个点维护两个树状数组,第一个表示其后代到他(不包括他自身)的答案(距离为下标,权值为数据,不用担心距离相同,因为本题求和值,直接相加即可),第二个表示其后代到该点父亲的答案(……与之前相同)。为何需要第二个数组?假定在x处发生y地震,我们用第一个算出后代的,但是祖先的结点也可能满足距离小于等于y,故可以暴力向上调用上面结点的第一个树状数组求出答案。显然,答案是会重复的,如何扣除?(静态点分治的容斥思想),假设当前在该结点第一个树状数组中统计距离k的答案,再向上用祖先的第一个树状数组中统计k-dis[u][i],最后在该结点自己的第二个树状数组中统计k-dis[u][i]的答案,这样就可以去除冗余,画图即可证明。对于更新,比较暴力,记住每个点两个树状数组的意义,从下往上暴力更新即可。

参考博客:戳

转载于:https://www.cnblogs.com/FormerAutumn/p/10262152.html

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

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

相关文章

python settings模块导入不了_无法导入设置“myproject.settings”(是否在sys.path上?):没有名为pinax的模块...

我正试图让皮纳克斯在网络派系工作,有这么多的问题。。。[Sun Feb 19 20:01:20 2012] [error] [client 127.0.0.1] mod_wsgi (pid22796): Exception occurred processing WSGI script /home/pawesome/webapps/qtsocial/myproject.wsgi.[Sun Feb 19 20:01:20 2012] […

VS2012 颜色配置成黑色

效果展示: 步骤: 1、工具->选项->环境->常规->颜色体验 选为深色 2、在http://studiostyl.es/schemes/son-of-obsidian中,下载Son of Obsidian字体设置,然后 工具->导入和导出设置->导入选定的环境设置->…

@bzoj - 2388@ 旅行规划

目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] 内的数同时加上一个增量 k。 (2)询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input …

java与java ee_Java EE 7社区调查结果!

java与java ee在JSR 342下可以继续进行Java EE 7的工作。一切都在顺利进行,Java EE 7现在处于早期草稿审查阶段。 在11月初, Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0…

浅谈C++中内存分配、函数调用和返回值问题

在谈述函数调用和返回值问题之前,先来看看C中内存分配的问题。 C编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区…

dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

1.退出日志应用模式[oraclelocalhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 16:09:16 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> connect / as sysdbaConnected.SQL> alter database recover managed sta…

python教程自带数据库_python教程自带数据库 | Python学哪个数据库

python使用数据库增条数据import pymysql#返回Connection#host"localhost"con pymysql.connect(host"192.168.31.28",port3306,user"atguigu",password"atguigu",db"atguigudb",charset"utf8")#返回cursor对象cu…

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度

使用Java SE 8新的DateTime API JSR 310…可以实现更清晰,可读且功能强大的编码。 Java SE 8,JSR 310 在上一篇文章“ 使用Streams API处理集合 ”中; 我已深入探讨和探索如何使用流遍历集合,如何从集合和数组创建流以及最终汇总…

使用VS2012内建的C++测试架构进行单元测试

前言 在软件开发的过程中,单元测试(Unit testing)是一个重要的coding步骤,可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计,单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作,在程序化编程中…

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句,但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作,同样的规则可使用在INTERSECT运算符。 但MySQL不支持…

vs2010下release版本调试设置

设置在Release模式下调试的方法: 1.工程项目上右键 -> 属性 2.c -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) 3.c -> 优化 -〉优化 选 禁止(/Od) 4.连接…

控制反转 java_控制反转( Ioc)快速入门

2.1 什么是控制反转(IOC:Inverse of Control)IOC反转控制,实际上就是将对象的创建权交给了Spring,程序员无需自己手动实例化对象。可以看出来工厂的作用就是用来解耦合的,而在使用spring的过程中,spring就是充当这个工…

spring 工作流引擎_带Spring的简单工作流引擎

spring 工作流引擎几个月前,在处理一个公司项目时,我们需要开发REST服务,该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间,我们决定创建简单的工作流引擎,该引擎将为发送电子邮件收费&#xf…

如何成为一个牛逼的C/C++程序员? (仔细阅读)

这个题目的噱头太大,要真的写起来, 足够写一本书了。 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。 每个人的情况不一样,我下面的描述可能并不适合每一个看到这篇文章的人。 一、C/C语言 如果你的…

java 两个字段排序,如何在Java中按两个字段排序?

I have array of objects person (int age; String name;).How can I sort this array alphabetically by name and then by age?Which algorithm would you use for this ?解决方案You can use Collections.sort as follows:private static void order(List persons) {Colle…

数据结构java语言描述朱战立_数据结构——树(Java语言描述)

树根:rootNode. 树只有一个树根。节点:Node. 树上的所有节点。子节点数组:Node[]. 数组代表每个节点的所有子节点父节点:parentNode. 每个节点只有一个父节点。2. Node为Tree中的内部类parent :指向父节点的引用childern: 孩子数组,存储该节点的所有子节…

centos7.4进入单用户模式

centos7.4进入单用户模式 1 - 在启动grub菜单,选择编辑选项启动2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init/sysroot/bin/sh 4 - 现在按下 Controlx ,使用单用户模式启动 5 - 现在,可以使…

判断某程序是64位还是32位

1. 用代码判断本身if (IntPtr.Size 4) {// 32-bit}else if (IntPtr.Size 8){// 64-bit}2. 用代码判断正在运行的其他进程http://stackoverflow.com/questions/1953377/how-to-know-a-process-is-32-bit-or-64-bit-programmatically3. 不用代码判断任意exe,看第二个…

MySQL 中 NULLIF 、IFNULL、IF 的用法和区别

在 MySQL 中,NULLIF、IFNULL 和 IF 是用于处理 NULL 值的三种不同的函数。 1. NULLIF 函数 NULLIF 函数用于比较两个表达式,如果它们的值相等,则返回 NULL,否则返回第一个表达式的值。语法如下: NULLIF(expr1, expr2…