CDQ分治与整体二分小结
前言
这是一波强行总结。
下面是一波瞎比比。
这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊。
很多很显然的东西都看不出来 分治分不出来 打不出来 调不对
上午下午晚上的效率完全不一样啊。
完蛋.jpg 绝望.jpg。
关于CDQ分治
CDQ分治,求的是三维偏序问题都知道的。
求法呢,就是在分治外面先把一维变成有序
然后分治下去,左边(l,mid)关于右边(mid+1,r)就不存在某一维的逆序了,所以只有两维偏序了。
这个时候来一波"树状数组求逆序对"的操作搞一下二维偏序
就可以把跨过中线的,左边更新右边的情况计算出来。
注意:只计算左边的操作对右边的询问的贡献!
然后左右两边递归处理就好了。
正确性:按照线段树的形态递归的CDQ分治,保证每一对三元组在线段树上都有且仅有一个LCA(这不废话吗),而这一组答案就会且仅会在LCA处计算。如果在LCA下面,点对不在一个work内自然不会计算。如果在LCA上面了,点对就在同一侧,不会互相更新。
复杂度:设一次work的复杂度是f(len),则复杂度是O(f(n)logn)。
一般都在分治里用树状数组,一般的复杂度就是O(nlog2n)的。
一般是这样的套路:假设三维偏序分别为a,b,c;
在main函数里保证a递增。
然后在CDQ里先分治左右,传下去的时候a仍然递增,不破坏性质。
然后分治完左右两边后,需保证左右两边分别b都是递增的(a不重要)。
然后就是类似归并排序的操作了。
此时左边的a肯定都小于右边的a,那么如果对于一个右边的元素
之前类似归并的操作就可以保证所有小于b的左边的元素都已经遍历过。
那么找c也小于它的?值域线段树/树状数组等数据结构维护一下就好了。
然后你这么归并了一波后,就发现统计完答案后b是有序递增的了(这个时候a已经不重要了)。
对于上层操作,符合"左右两边分别b是递增的"了。
BZOJ陌上花开竟然是权限题?这是在搞笑。
好吧BZOJ动态逆序对,之前写过的,做两次CDQ就好了。
BZOJ稻草人,也是CDQ。
关于整体二分
整体二分主要是把所有询问放在一起二分答案,然后把操作也一起分治。
什么时候用呢?
当你发现多组询问可以离线的时候
当你发现询问可以二分答案而且check复杂度对于单组询问可以接受的时候
当你发现询问的操作都是一样的的时候
你就可以使用整体二分这个东西了。
具体做法讲起来有些玄学。
想想:二分答案的时候,对于一个答案,是不是有些操作是没用的,有些操作贡献是不变的?
比如二分一个时间,那么时间后面发生的操作就是没有用的,时间前面的贡献是不变的。
二分一个最大值,比mid大的都是没用的,比mid小的个数是一定的。
整体二分就是利用了这么一个性质。
二分答案,然后把没有用的操作扫进右边,和答案在[mid+1,r]的询问一起递归处理。
把有用的操作放进左边,减去不变的贡献,和答案在[l,mid]的一起递归处理。
注意答案在[mid+1,r]的询问要算上放进了左边的操作的贡献,开个变量记下来/直接减掉都可以。
注意整体二分在solve内的复杂度一定只能与区间长度线性相关,不能每次都有别的复杂度!
比如一次solve的复杂度是O(lenlogn)就可以,O(len+sqrt(n))就不行。
大概就是这么一个东西。
复杂度?和CDQ是一样的,都是O(f(len)logn)。
例题?BZOJ3110 K大数查询 Codevs Meteors。
一样的套路了。
关于一些要注意的地方
归并一定要把剩下的搞完!每次我都忘记这码子事!
树状数组不能暴力清零!记个time或者依葫芦画瓢减回去都可以,一定不能清零!
不要在CDQ里面套sort,太慢辣!(一定进不了第一版的!)
CDQ分治与整体二分小结的更多相关文章
- [学习笔记]CDQ分治和整体二分
序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...
- CDQ分治与整体二分学习笔记
CDQ分治部分 CDQ分治是用分治的方法解决一系列类似偏序问题的分治方法,一般可以用KD-tree.树套树或权值线段树代替. 三维偏序,是一种类似LIS的东西,但是LIS的关键字只有两个,数组下标和 ...
- 技巧专题3(cdq分治、整体二分等)
cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...
- Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]
洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...
- 【BZOJ4237】稻草人 cdq分治+单调栈+二分
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...
- Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的\(n\)个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 \(1\leq n\ ...
- [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)
题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li,ri] 之间的边删掉后,该图是否存在奇数环 ...
- 【BZOJ 4025】 (CDQ?还是整体二分?+并查集及它的恢复操作)
4025: 二分图 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考 ...
- 一篇自己都看不懂的CDQ分治&整体二分学习笔记
作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...
随机推荐
- 照虎画猫写自己的Spring——自定义注解
Fairy已经实现的功能 读取XML格式配置文件,解析得到Bean 读取JSON格式配置文件,解析得到Bean 基于XML配置的依赖注入 所以,理所当然,今天该实现基于注解的依赖注入了. 基于XML配 ...
- ThinkPHP中处理Layout模板的问题
ThinkPHP中的模板引擎内置了布局模板功能支持,可以方便实现嵌套. 其中有两种布局方式,一种为以布局模板为入口的布局方式,但是需要开启LAYOUT_ON 参数(默认不开启) 并且设置布局入口文件名 ...
- Spring集成Redis缓存
作者:13 GItHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...
- LVS+keepalived快速搭建测试环境
#LVS+keepalived快速搭建测试环境 #LVS+keepalived快速搭建测试环境 #centos6 X64 # LVS 负载均衡模式:DR(直接路由) 192.168.18.31 mas ...
- Nginx 搭建rtmp直播服务器
1.到nginx源码目录新建个rtmp目录 ,进入 git clone https://github.com/arut/nginx-rtmp-module.git 2.重编译nginx 代码如下 ...
- session与cookie的区别与联系
session与cookie是在做项目中很常用的会话技术,session与cookie也是面试中被问到频率最高的问题,有一次我去面试,面试官就怼着我session与cookie一直问(头都大了),下面 ...
- OAuth 2.0(网转)
(一)背景知识 OAuth 2.0很可能是下一代的"用户验证和授权"标准,目前在国内还没有很靠谱的技术资料.为了弘扬"开放精神",让业内的人更容易理解" ...
- 小tip:生成一组不重复的随机数(去重的方法)
var arr = []; for(var i=0;i<150;i++){ // num为0-100的随机数 var num = Math.round(Math.random()*100); v ...
- iOS旋钮动画-CircleKnob
欢迎相同喜欢动效的project师/UI设计师/产品添加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 前段时间和群里的一个设计师配合. ...
- zephyr初始化流程
1.调用应用层main()函数 kernel/init.c 181行 /** * * @brief Mainline for kernel's background task ...