当前位置: 首页 > 编程日记 > 正文

(点)分治学习笔记

哗我看了一下好像没有很详细专门讲分治的blog?那就主要先学一下点分治吧,其他的……等我记得把C++一本通带到机房来再说吧先咕着啦

写在前面

刷题进度

入门题(0/3)

好题(0/9)

问题解决进度

Q1

Q2


 正文

淀粉质

点分治

点分治就是在一棵树上,对具有某些限定条件的途径静态地进行统计的算法。

——《算法竞赛 进阶指南》(李煜东)

这句话看起来很高深的样子……(这本书上的话都很高深)

让我们来结合题目理解一下

【例】Tree  (POJ1741)

题目大意

给定一棵有n个结点的树,每条边都有一个权值。树上两个结点x与y之间的路径长度就是路径上各条边的权值之和。求长度不超过k的路径有多少条。

解题思路

本题树中的边是无向的,即这棵树是一个由n个结点,n-1条边构成的无向连通图,即这是一棵无根树。

若指定结点p为根,则对于p来说,树上的路径可以分为两类:

1.经过根结点p

2.包含于p的某一棵子树中(不经过根结点)

根据分治的思想,对于第2类路径,显然可以把p的每棵子树作为子问题,递归处理

然而……对于第1类路径,可以从根结点p分成"x~p"与“p~y”两段(——话说这不是和LCA有点联系??),于是从p出发对整棵树DFS,求出d[i]表示i结点到根结点p的距离,b[i]表示i属于根结点p的哪一棵子树(注意b[p]=p)

此时满足题目要求的第1类路径就是满足以下两个条件的点对(x,y)的个数

——这句话特别奇怪(我感jio)……我的理解就是

如果点对(x,y)满足以下两个条件,那么x到y的路径就是上面提到的第1类路径且路径长度满足题目不超过k的要求

条件如下:

1.b[x]≠b[y]

2.d[x]+d[y]≤k

那么接下来问题来了——如何统计上述点对的个数呢?

定义函数Calc(p)表示在以p为根的树中统计上述点对(x,y)的个数

有两种实现方法:

1.树上直接统计

2.指针扫描数组

接下来分别介绍一下这两种方法QWQ

一、树上直接统计

设p的子树为s1,s2,s3……sm

对于si中的每个结点x,把在子树s1,s2,s3……si-1中的满足d[x]+d[y]≤k的结点y的个数直接累加到答案中即可

具体来说,可以建立一个树状数组,依次处理每棵子树si

对si中的每个结点x,操作如下:

1.查询前缀和ask(k-d[x]),即为所求的y结点的个数

2.执行add(d[x],1),表示与p距离为d[x]的结点增加了一个

我感jio不太明白这里要怎么实现啊……书上又没有代码,我还是去问一下dalao吧QAQ

go back

继续……

按子树一棵棵处理保证了b[x]≠b[y],查询前缀和保证了d[x]+d[y]≤k

注意

树状数组的范围与路径长度有关,这个范围远比n要大,本题不易进行离散化

一种解决方案是用平衡树代替树状数组,以保证O(nlogn)的复杂度,但这样代码复杂度会显著增加

(真的是“显著”增加呀,因为我根本就不会平衡树QAQ,离散化也不太清楚天哪我简直是个渣渣QAQ)

两种方法各有千秋,对于这道例题来说,第二种方法更加合适,所以我接下来要讲一讲第二种方法

二、指针扫描数组

先把树中的每一个结点放进一个数组a,并按照结点距离根结点的距离(即d的值)排序

使用两个指针L,R分别从前、后开始扫描a数组

容易发现一个规律:

在指针L从左向右扫描的过程中,恰好使得d[a[L]]+d[a[R]]≤k的指针R的范围是从右向左单调递减的

另外,用数组cnt[s]维护在L+1与R之间满足b[a[i]]=s的位置i的个数

于是,当路径的一段x=a[L]时,满足题目要求的路径另一端y的个数就是R-L-cnt[b[a[L]]]

然后就……结束了?QAQ我也不懂怎么实现啊救命啊啊啊啊啊

go back

整理一下整个点分治算法的过程

1.任选一个根结点p(下面有说选根结点时的具体要求)

2.从p出发执行一次DFS,求出d数组和b数组

3.执行Calc(p)函数

4.删除根结点p,对p的每棵子树(同样看做是无根树)递归执行1~4步直至叶子结点(结束)

时间复杂度

在点分治过程中,每一层的所有递归过程合计对每个结点处理1次

因此,若递归到第T层,则整个算法的时间复杂度就是O(Tnlogn)

如果问题中的树是一条链,最坏情况下每次都以链的一端为根,那么点分治将需要递归n层,时间复杂度退化到O(n2logn)

为了避免这种情况,我们每次选择树的重心作为根结点p

此时易证p的每棵子树大小不会超过整棵数大小的一半,点分治至多就递归logn层,所以整个算法的时间复杂度为O(nlong2n)

常见问题

点分治主要可以解决的问题就是处理路径统计还有处理换根统计问题

要刷的题目

入门题  (go back)

LuoguP3806

LouguP4178

CF116D

好题(我觉得我一辈子都做不完这些题的

树上的点对

开店

捉迷藏

qtree5

重建计划

Race

快递员

树的难题

树上游戏

关于重心

树的重心是什么?(有种小学作文开头的赶脚)

如果把一个结点x从树中删除,那么原来的树就分成了若干个连通块,而max表示这些连通块中最大的那个连通块的大小

若用max[x]记录删除结点x后产生的最大连通块的大小

那么整个max数组中若max[p]最小,则称结点p为这棵树的重心

go back

转载于:https://www.cnblogs.com/THWZF/p/10359578.html

相关文章:

十五个步骤收获学习的习惯

"真正的发现的航程,并非是在寻找新的土地,而且用新的视界去寻找"--普鲁斯特 "智慧日进者方值得尊敬。"-林肯 "我从不让我在学校所学的干扰我的教育"-马克吐温 如果公立学校尚未摧残你的灵魂,那么学习是一项极佳的活动。它…

熟悉scala命令,scala语言运行超级素数和猴子大王

实验目的 在Linux操作系统中安装Scala输入“scala”命令,熟悉地运行Scala解释器scala语言运行超级素数和猴子大王实验仪器 Virtualbox管理器 实验框图(电路图/流程图) 在Windows中使用VirtualBox安装Ubuntu,安装好scala后&#xf…

安装mayavi和VTK库的血泪史

一开始安装VTK库是从官网上下载,但是怎么都找不到whl文件,只有exe文件(vtkpython-7.1.1-Windows-64bit.exe)。下载安装之后再PyCharm中import vtk出错。当时认为是文件出错。后来在一篇博客(Python下VTK 编程 - lj6952…

Python LEGB (Local, Enclosing, Global, Build in) 规则

1 Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性2 Global 一个 module 定义了一个 global 作用域; PyFrameObject 中的 f_global 属性.3 BuiltIn open, dir 的作用域等等, python 最顶层的作用…

图解DotNet框架系列

图解.Net框架系列(索引贴) (声明:本系列已完成,故索引帖重发) 众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文…

【Linux基础】文件处理实例

1.文件拆分 //每4000行拆分一个文件 split -l 4000 epms_t_ep_fx_stl_xy_20190129.dat 2.行处理 //查找第二列为711611且第三列为711100记录,打印行号和整行数据 awk -F ‘^C’ {if ($3711100 && $2711611) print NR,$0 } epms_t_ep_fx_stl_xy_20190229.d…

scala语言运行递归“分鱼”程序

A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 B 第二个醒来,也将鱼分…

smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。...

smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。function smarty_modifier_truncate($string, $length 80, $etc ..., $codeutf8, $mbtrue) { if ($length 0) return $string; if(function_exists("mb_subs…

java基础小总结(2)

Day07: 1.如果局部变量和全局变量都有相同的数据类型和变量名,先调用局部变量,实现就近原则; 2.匿名对象由于局限性的原因,一般只调用一次,且只是当作为实际参数传递的时候使用; 3.面向对象语言…

Wireshark实验HTTP

在 Wireshark 实验入门里,我们已经初步使用了 Wireshark 包嗅探器,我们现在可以操作 Wireshark 来查看网络协议。在这个实验中,我们会探索 HTTP 协议的几个方面:基本的 GET/response 交互,HTTP 消息格式,检…

2、安装ICS(Internet Component Suite)控件

下载完成后解压到你的指写目录!1、在library里加入ICS->Delphi->Vc32目录。2、从File->Open中打开ICS->Delphi->Vc32->IcsDel110.dproj文件。(文件名在其它Delphi版本略有不同)3、在项目管理器中,右键IcsDel110.bpl选择Build和Install…

定制CE系统随笔-续1

更改用户界面颜色[HKEY_LOCAL_MACHINE\SYSTEM\GWE] "SysColor"hex: 00,00,00,00, 3A,6E,A5,00, 00,00,00,00, 00,00,00,00,\ EF,EB,DE,00, FF,FF,FF,00, 00,00,00,00, 00,00,00,00,\ 00,00,00,00, FF,F…

安装包安全测试

主要说明以下内容:1、能否反编译代码2、安装包是否签名3、完整性校验4、权限设置检查反编译代码:移动应用发布出去后最终用户获得的是一个程序安装包,我们需要关注的是用户能否从这个安装包中获取项目的源代码,从安全方面考虑&…

Java课程寒假之开发记账本软件(网页版)之二

一.实现基础功能之一(记账) 一个记账本最基础之一的功能就是记账,所以也是首先要解决的问题,我选择了上学期使用的MySQL数据库来对账本进行存储。 我选择记账的方法是分开记账,就是支出放在一个表,收入放在…

谷歌浏览器Google Chrome和Adobe Flash Plugins插件安装问题

最近在做CSS的多浏览器支持,于是安装上了谷歌浏览器Google Chrome浏览器,结果发现谷歌浏览器Google Chrome的确构造非常简单,精干,速度非常迅猛,比臃肿的IE8快多了,于是开始使用谷歌浏览器Google Chrome&am…

Wireshark实验 - 入门

# Wireshark实验 - 入门 **官方英文文档:[Wireshark_Intro_v6.0.pdf](Wireshark_Intro_v6.0.pdf)** **以下内容为笔者翻译:** *** ## Wireshark 实验: 入门 v6.0 **《计算机网络:自顶向下方法(第6版)》补充材料&…

观察者模式的经典应用(猫叫 烧开水)

Code 猫叫了 老鼠跑 主人惊醒 1/**//* 2 * 题目: 3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程 4 * 1,老鼠跟主人是被动的 5 * 2,要考虑联动性与扩展性 6 */ 7using System; 8using Sys…

HTML学习笔记之基本介绍

超文本标记语言 (Hyper Text Markup Language,HTML)不是一种编程语言,而是一种标记语言,用一套标记标签描述网页 HTML 标记标签又被称为 HTML 标签(HTML Tag),它是由尖括号包围的关键词&#xf…

系统分析与设计 实验一用例模型

图书管理系统系统分析及用例图 图书管理系统能够为一定数量的借阅者提供服务。每个借阅者能够拥有唯一标识其存在的编号。图书馆向每一个借阅者发放图书证,图书证中包含每一个借阅者的编号和个人信息。系统通过一个单独的程序为借阅者提供服务,不需要管理…

2017.9.12.语文

列夫尼古拉耶维奇托尔斯泰(Лев Николаевич Толстой,1828年9月9日-1910年11月20日)19世纪中期俄国批判现实主义作家、思想家、哲学家。 转载于:https://www.cnblogs.com/mldyz/p/7510750.html

一封会笑死人的校园情书

Kiss郝美丽: Sorry!我把Miss拼成了Kiss,一不小心吻了你,实在是对不起! 吾本良家子弟,正统少年,一向对美眉们保持一种昂首挺胸,目不斜视的高姿态,人送美名…

Java面试题之多线程同步和互斥有几种实现方法,都是什么?

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,每个线程访问时的排他性。当有若干个线程…

1)头结点,头指针,

http://blog.csdn.net/zhenyusoso/article/details/6092843 转载于:https://www.cnblogs.com/xiaoyoucai/p/7512001.html

软件测试实验--数据工厂DataFactory+MySQL数据构造

数据工厂---DataFactoryMySQL数据构造 显示成功,但测出来的是啥...

杀进程和取文件最近使用时间

unit uFTPclient; interface uses SysUtils,Windows,Tlhelp32; const FILE_CREATE_TIME0; //文件建立时间 FILE_MODIFY_TIME1; //修改时间 FILE_ACCESS_TIME2; //最后访问时间 type TFileTimes (ftLastAccess, ftLastWrite, ftCreation); //文件是否…

局域网常见问题

1.开启Guest用户 密码可以不设,这样可以只输入账号Guest,即可登录(互访)。但需要保证以下策略的开启。 点击“开始→运行”并输入“gpedit.msc”,打开组策略。依次点击“计算机配置→Windows设置→安全设置→本地策略→安全选项”&#xff0c…

visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案

一般默认比较旧有两个原因,系统版本过旧,Visual Studio 版本过旧。 第一步,将windows 更新到最新版,必须是windows 10 并且更新到最新。 第二步,将visual studio -> 工具 -> 扩展和更新 ,安装完所有更…

软件测试--利用正交表设计测试用例

输入条件如下: 姓名:填、不填 性别:男、女 学历:小学、初中、高中、专科、本科、硕士、博士 等级:普通、VIP 用正交表设计测试用例 Allpairs安装及使用 输入数据时要用tab键,或者使用excel表格处理 测试用…

TensorFlow 实现分类操作的函数学习

函数:tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, nameNone) 说明:此函数是计算logits经过sigmod函数后的交叉熵值(即互熵损失),能帮助你更好的进行分类操作。对于一个不相互独立的离散分类任务&#x…

【推荐】极限编程的十二大原则——小版本

小版本:用最少的代码工作量带来最大的业务价值。 这个原则是意思是为了高度迭代,与客户展现开发的进展,小版本发布是一个可交流的好办法,客户可以针对性提出反馈。但小版本把模块缩得很小,会影响软件的整体思路连贯&am…