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.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...
随机推荐
- 详谈Javascript类与继承
本文将从以下几方面介绍类与继承 类的声明与实例化 如何实现继承 继承的几种方式 类的声明与实例化 类的声明一般有两种方式 //类的声明 var Animal = function () { this. ...
- 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一
简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页 和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...
- webpack 1.x 学习总结
webpack介绍(from github): A bundler for javascript and friends. Packs many modules into a few bundled ...
- 关于mysql插入数据异常
今天创建数据库时,在插入数据时出现了几个问题.(首次在LInux环境下创建数据库) 一个是关于SQL Error [1146] [42S02]: Table 'struts2exec.s_user' ...
- 利用python对excel进行数据剔除
需求分析: 判断excel2表中的某个唯一字段是否满足条件,如果满足条件,就在excel1中进行查询,若存在excel中,就将该数据进行剔除. python脚本的实现: from __future__ ...
- mssql执行计划查看的一些知识
在MSSQL中,查看较慢语句的执行计划,就是一个比较直观的方式, 如果查看执行计划呢: 1.从右到左,从上到下的顺序阅读执行计划2.执行计划中每个图标代表一个运算符,总开销为100%3.数据从右向左在 ...
- WCF、WebAPI、WCFREST、WebService之间的区别和选择
转载翻译,原文:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-a ...
- Spring Data 整合 ElasticSearch搜索服务器
一.基于 maven 导入坐标(pom.xml文件) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...
- poj 3070 && nyoj 148 矩阵快速幂
poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...
- mysql 索引类型
根据类型分为普通索引2种类型,hash 和b-tree 最常用 hash是按一对一索引的.速度 最快但不支持范围 比如where name = 'dd' 最快.但是使用 date >3 ...