【cdq分治】cdq分治与整体二分学习笔记Part1.整体二分

之所以把cdq分治和整体二分放在一起学习,是因为他们两个实在太像了…不管是做法还是代码…

感觉整体二分可能会比cdq分治稍微简单那么一点点?所以先学整体二分.(感觉他们的区别在于整体二分是对每个操作二分答案,cdq是分治了操作序列)

整体二分是对答案进行二分,其具体操作如下:

(比如以ZJOJ2013K大数查询为例)

具体过程

Step1.从(L,R)二分答案.mid=(L+R)>>1,用线段树维护原序列中(a,b)位置比mid大的数有多少个,同时记录对序列的操作分别是什么操作.

Step2.执行给定操作.

1.如果操作是插入,比如在a,b位置之间每个数后插入一个数c

①如果c>mid就在线段树的(a,b)部分加一,然后修改操作标记为1;

②如果c<mid,修改操作标记为0;

2.如果操作是查询,如果线段树(a,b)段的和大于c,那么答案必定比mid大,修改操作标记为1,否则操作标记为0.

Step3.进入下一层.所有标记为0的,分入区间(L,mid),标记为1的分入区间(mid+1,R).(这里重新划分后要再排序.可以归并(当然效率很高),不过直接sort也可以的.)

直到二分到L==R,L即为所求答案.

每次二分到新的答案,我们要直接清空线段树.(在根节点打清空标记,否则区间太大用memset会炸掉)

与当前访问区间不相交的另一段区间,其实始终对我们二分的答案有影响,只要记录一下这个影响就可以了,所以不需要去考虑它.

所以我们可以看出来,整体二分就是不断对数列进行划分,划分的标准就是数值的大小.因此其复杂度也是与数列长度正相关的.

时间复杂度的证明可以看2013年国家集训队论文许昊然《浅谈数据结构题的几个非经典解法》

如果您不想翻论文,我很贴心的把那一段证明引用到下面来(其实为了加深理解下面这些我都手打了):

定义T(C,S)表示待二分区间长度为C,待二分序列长度为S,不妨设单次处理时间复杂度O(f(n))则有

T(C,S)=T(C2,S0+T(C2,S-S0))+O(f(s))

解之得 T(C,n)≤O(f(n)log C)

注,与上文一样该证明只有在O(f(n))≥O(n)时成立.

具体题目后面单独写题解.(你问我为什么不像别人一样把题解当例题写着里面?我要刷访问量和文章量啊233)

时间: 2024-12-24 19:52:22

【cdq分治】cdq分治与整体二分学习笔记Part1.整体二分的相关文章

Hadoop入门学习笔记---part1

随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力,好好做.正是因为选题和hadoop有关,现在正式开始学习hadoop.将笔记整理于此,希望与志同道合的朋友共同交流. 作者:itRed 邮箱:[email protected] 个人博客链接:http://www.cnblogs.com/itred 好了,废话不多说.进入正题!开始hadoop的学习

Bootstrap学习笔记之整体架构

之前有粗略地看过一下Bootstrap的内容,不过那只是走马观花式地看下是怎么用的,以及里面有什么控件,所以就没想着记笔记.现在由于要给部门做分享,所以不得不深入地去学习下,不然仅是简单地说下怎么用,那就无异于“谋杀”别人(浪费别人的时间等于谋财害命——鲁迅). 1.整体架构 下图为Bootstrap的整体架构图,共分为六大部分:  1.1.12栅格系统 12栅格系统就是把网页的总宽度平分为12份,我们可以自由按份组合.栅格系统使用的总宽度可以不固定,Bootstrap是按百分比进行平分.(保留

Java学习笔记 Part1

1. 因为家里win7系统的c盘已经满了(0kb可用),只能用winxp的电脑 但是j8不支持xp,所以想在百度下个jdk7 后来在帮助下,发现jdk7在官网的最下面…… 2. eclipse的安装…… 这一个就不大费劲了,就是在安装过程中一直提示我安装速度太慢: 搞完之后选这个就行了 3. 如果没学c,就直接用guide的感觉,应该和我没学java,就直接用eclipse一样吧…… 在c-free里面,直接新建空白文档,然后写好代码,按play形按钮,就可以了 但是eclipse麻烦得多……

js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1

1. 前言 这两天看了一下TOM大叔的<深入理解js系列>中的基础部分,根据自己的实际情况,做了读书笔记,记录了部分容易绊脚的问题.写篇文章,供大家分享. 2. 关于HTMLCollection的“实时查询” var divs = document.getElementsByTagName("div"), i; for (i = 0; i < divs.length; i++) { //…… } 以上代码中,会出现性能问题.问题就在于divs是一个HTMLCollec

#[Composer学习笔记]Part1:安装composer并通过composer创建一个项目

安装composer 这里分享的是linux下的composer安装: 首先,创建一个目录放置composer,并进入目录: mkdir /opt/composer cd /opt/composer 下载composer,下载成功后注册composer.phar为全局命令 curl -sS https://getcomposer.org/installer | /opt/php/bin/php ln -s /opt/composer/composer.phar /bin/composer.pha

Foundations of Qt Development 学习笔记 Part1 Tips1-50

1. 信号函数调用的时候仅仅会发送出信号,所以不需要执行 ,所以对于信号声明就行,但是不需要进行定义. 2. 只有槽函数可以声明为public,private,或者是protected的,而信号不行.可以将slot仅仅看成是一个与信号相关联的成员函数. 3. Qt的元对象指的是QMetaObject的实例,Qt中的元对象系统是用来处理对象间通讯的信号/槽机制.运行时的类型信息和 动态属性系统.虽然你使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的, 但是如果Q_OBJ

.NET学习笔记(1)— C#学习路线图

目录 一:引言 二:.NET技术体系 三:常用工具汇总 四:学习资源汇总 五:书籍推荐 六:关于阅读技术书籍的经验 七:总结 一:引言 因为工作调整,从PHP开发零基础转型到.NET开发,前期没有太多空闲时间去系统学习.只好独辟蹊径,寻找快速掌握满足当前需求的方法,和大家分享: <一>:先搜集.NET平台重点知识点的概念名称,然后通过网络搜集该知识点的学习资料,尽可能宏观地了解这个全新技术体系的语法结构,涉及的编程练习题反复练习: <二>:逐行阅读工程源代码,再通过网络学习遇到的知

javascript - 浏览TOM大叔博客的学习笔记

part1 --------------------------------------------------------------------------------------------------------- 1. 前言 这两天看了一下TOM大叔的<深入理解js系列>中的基础部分,根据自己的实际情况,做了读书笔记,记录了部分容易绊脚的问题.写篇文章,供大家分享. 2. 关于HTMLCollection的"实时查询" var divs = document.ge

js便签笔记(12)——浏览TOM大叔博客的学习笔记 part2

1. 前言 昨天写了<js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1>,简单记录了几个问题.part1的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭包数据的问题.如果觉得有兴趣,可以再重新翻出来看看. 今天继续把剩下的问题写完. 2. 作用域链 学js的人,即使初级入门的也都知道“原型链”,但是“作用域链”,可能好多人没有听说过.大部分人都知道或者听说过“闭包”,但是可能有好多人不知道闭包其实和作用域链有莫大的联系.如果理解闭包不从作用域链开始理解,那么