CDQ分治

CDQ(陈丹琦)分治是一种特殊的分治方法。

它只能处理非强制在线的问题。

CDQ分治在维护一些动态的凸包、半平面交问题也有一定应用,然而本渣渣并不会。

CDQ分治基于时间分治,整体二分基于答案分治。

步骤

1:将操作按照某个关键字排序

2;算出[L,mid]对[mid+1,R]的贡献

3;递归处理[L,mid]和[mid+1,R]

注:这里的区间指的是操作区间。

题目必须满足“修改独立,允许离线”两个条件。

这样的话我们把操作区间二分

会发现后一半的修改操作对前一半的询问操作不会产生影响

前后两个区间的联系只是前一半的修改操作会影响后一半的询问操作。

这个东西我们是可以事先算出来的:对于在满足某种限制下的答案贡献进行合并

用CDQ分治可以解决多维偏序问题

例题

    一道简单的题目(来自YJY学长)

你有一个长度为N的棋盘,每个格子内有一个整数

两种操作:

1 x A 将格子x里的数字加上A

2 x y输出x y 这个区间内的数字和

1<=N<=100000,操作数不超过10000个,内存限制128M。

是不是很水啊。。。

几个做法

  • 暴力O(NM)
  • 线段树单点修改区间查询或树状数组维护差分数组O((n+m)logn)
  • 分块修改O(1),查询O(q√N)
  • 那么CDQ分治怎么做?

我们对x升序排序,然后按照时间分治,分治的时候记录一个前缀和
我们要保证贡献的计算不重不漏,根据上面的思路,是不是非常简单啊。。。

#include<algorithm>
#include<cstdio>
#define MAXN 100001
using namespace std;
int s[MAXN],n,m,tot,t,sum,ans[MAXN];
struct data{int x,k,t,o,z,belong;}q[MAXN*2],tmp[MAXN*2];
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
bool cmp(const data &x,const data &y){
if(x.x!=y.x) return x.x<y.x;
else return x.k<y.k;
}
void slove(int l,int r){
if(l==r) return ;
int mid=(l+r)>>1,ll=l,rr=mid+1;
for(int i=l;i<=r;i++){
if(q[i].k==1&&q[i].t<=mid) sum+=q[i].z;
else if(q[i].k==2&&q[i].t>mid) ans[q[i].belong]+=sum*q[i].z;
}
for(int i=l;i<=r;i++){
if(q[i].t<=mid) tmp[ll++]=q[i];
else tmp[rr++]=q[i];
}
sum=0;
for(int i=l;i<=r;i++) q[i]=tmp[i];
slove(l,mid),slove(mid+1,r);
return ;
}
int main()
{
int x,y,z;
n=read();
for(int i=1;i<=n;i++) x=read(),q[++tot].x=i,q[tot].k=1,q[tot].z=x,q[tot].t=tot;
m=read();
for(int i=1;i<=m;i++){
z=read(),x=read(),y=read();
if(z&1) q[++tot].x=x,q[tot].k=1,q[tot].z=y,q[tot].t=tot;
else{
q[++tot].x=x-1,q[tot].k=2,q[tot].z=-1,q[tot].t=tot,q[tot].belong=++t;
q[++tot].x=y,q[tot].k=2,q[tot].z=1,q[tot].t=tot,q[tot].belong=t;
}
}
sort(q+1,q+tot+1,cmp);
slove(1,tot);
for(int i=1;i<=t;i++) printf("%d\n",ans[i]);
return 0;
}

BZOJ  2683简单题

CDQ 学习笔记的更多相关文章

  1. CDQ学习笔记

    CDQ三维偏序 给出n个点(x,y,z) 每个点求出x'<=x,y'<=x,z'<=x的点(x',y',z')有多少个 第一维 快排 第二维 CDQ 第三维 树状数组 CDQ 先按x ...

  2. 学习笔记 | CDQ分治

    目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...

  3. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  4. 【框架】Django入门学习笔记

    教程 Demo 教材2 教材3 [转] Django处理请求的工作机制 记住: 1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py.该文 ...

  5. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  6. KD-Tree 学习笔记

    这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

随机推荐

  1. ubuntu设置ssh登陆

    转: 默认请况下,ubuntu是不允许远程登陆的.(因为服务没有开,可以这么理解.) 想要用ssh登陆的话,要在需要登陆的系统上启动服务.即,安装ssh的服务器端 $ sudo apt-get ins ...

  2. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  3. Linux 下安装Python报错:zlib not available

    问题描述: 在Linux下安装Python时出现一个错误:zipimport.ZipImportError: can't decompress data; zlib not available 详细错 ...

  4. Unity和Lua交互

    用lua就表示项目用到了热更新,通常每次热更新都会从服务器获取最新的lua脚本放到Android/ios设备的本地目录下,但是lua应该放到哪个目录下呢,这里就先说说lua里面的路径问题 1.不可以放 ...

  5. drf 缓存扩展

    drf缓存给了一个非常方便的扩展,使用起来相当方便 1-   安装 pip install drf-extensions 2-配置 在settings里面增加两项配置 # drf扩展REST_FRAM ...

  6. browsersync的安装与基本使用

    browser-sync启动命令 Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 官网文档:http://www.brows ...

  7. mysql数据库----Pymysql

    本节重点: pymysql下载和使用 sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall 一.pymysql的下载和使用 之前我们都是通过M ...

  8. 详细讲解Java中方法的重载和重写

    首先讲讲方法的重载: Java的重载就是在类中可以创建多个方法,它们具有相同的名字,但是却有不同的参数. 判断是否重载只有两个条件: 1)相同的方法名 2)不同的参数 具体为: A.方法参数类型不同 ...

  9. 【iOS开发】iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  10. 编译程序提示配置PKG_CONFIG_PATH

    http://blog.csdn.net/langeldep/article/details/6804331 在安装开源软件的过程中, 经常会碰到提示配置PKG_CONFIG_PATH路径, 或者直接 ...