之前听大神讲过CDQ分治大概是个什么东西,但是一直还没有真正去搞过。今天稍微看了一下,写点自己的理解。

首先CDQ分治有两个条件。

条件1:可以分成两个独立互不影响的问题(这里的“独立”是指将前面区间的影响处理掉后,后面与前面都成为了新的相同问题)

条件2:允许离线(据说最近流行强制在线。。。如果这样只好去写恶心的数据结构了)。

CDQ分治在可以使用的情况下很多高级数据结构题可以用CDQ分治干过去,不仅时空优越而且易于调试(虽然我并不觉得很好调试

大体思路是将问题不断分成两个子问题,用前一个子问题中的修改操作去更新后一个子问题,这样之后就得到了两个互不影响的子问题,达到分治的目的。

贴一道版题代码:BZOJ 1176

 #include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&-(x))
struct data{
int v,x,y,d,f,pos;
bool operator <(const data& w)const{
if(x!=w.x) return x<w.x;
if(y!=w.y) return y<w.y;
return pos<w.pos;
}
}a[],tmp[];
int s,w,t[],cnt,ans[];
int read(int& x){
x=; int f=,a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar(); x*=f;
}
inline void add(int y,int x){for(int i=y;i<=w;i+=lowbit(i)) t[i]+=x;}
inline int query(int y){int ret=; for(int i=y;i;i-=lowbit(i)) ret+=t[i]; return ret;}
void CDQ(int l,int r){
if(l==r) return;
int mid=(l+r)>>,t1=l-,t2=mid; //这里写错调了老半天
for(int i=l;i<=r;i++){
if(a[i].v<=mid && !a[i].pos) add(a[i].y,a[i].d);
if(a[i].v>mid && a[i].pos) ans[a[i].pos]+=query(a[i].y)*a[i].f;
}
for(int i=l;i<=r;i++)
if(a[i].v<=mid && !a[i].pos) add(a[i].y,-a[i].d);
for(int i=l;i<=r;i++)
if(a[i].v<=mid) tmp[++t1]=a[i];
else tmp[++t2]=a[i];
for(int i=l;i<=r;i++) a[i]=tmp[i];
CDQ(l,mid); CDQ(mid+,r);
}
int main(){
read(s); read(w); int t,x,y,d,x1,x2,y1,y2;
while(){
read(t);
if(t==){
read(x); read(y); read(d);
a[++cnt]=(data){cnt,x,y,d,,};
}else if(t==){
read(x1); read(y1); read(x2); read(y2); ++ans[];
a[++cnt]=(data){cnt,x1-,y1-,,,ans[]};
a[++cnt]=(data){cnt,x2,y2,,,ans[]};
a[++cnt]=(data){cnt,x1-,y2,,-,ans[]};
a[++cnt]=(data){cnt,x2,y1-,,-,ans[]};
}else break;
}
sort(a+,a++cnt);
CDQ(,cnt);
for(int i=;i<=ans[];i++)
printf("%d\n",ans[i]);
return ;
}

胡扯两句——CDQ分治的更多相关文章

  1. Hdu5126-stars(两次CDQ分治)

    题意: 简化就是有两种操作,一种是插入(x,y,z)这个坐标,第二种是查询(x1,y1,z1)到(x2,y2,z2)(x1<=x2,y1<=y2,z1<=z2)的长方体包含多少个点. ...

  2. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  3. cdq分治的小结

    cdq分治 是一种特殊的分治 他的思想: 1.分治l,mid 2.分治mid+1,r 3.计算l,mid对mid+1,r的影响 3就是最关键的地方 这也是cdq的关键点 想到了这一步基本就可以做了 接 ...

  4. 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)

    点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...

  5. luogu P3157 [CQOI2011]动态逆序对(CDQ分治)

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  6. CDQ分治题目小结

    CDQ分治属于比较特殊的一类分治,许多问题转化为这类分治的时候,时空方面都会有很大节省,而且写起来没有这么麻烦. 这类分治的特殊性在于分治的左右两部分的合并,作用两部分在合并的时候作用是不同的,比如, ...

  7. [学习笔记] CDQ分治 从感性理解到彻底晕菜

    最近学了一种叫做CDQ分治的东西...用于离线处理一系列操作与查询似乎跑得很快233 CDQ的名称似乎源于金牌选手陈丹琦 概述: 对于一坨操作和询问,分成两半,单独处理左半边和处理左半边对于右半边的影 ...

  8. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

  9. BZOJ1173 CDQ分治 笔记

    目录 二维数据结构->cdq 预备知识 T1: 二维树状数组 T2:cdq分治 bzoj1176 mokia:Debug心得 一类特殊的CDQ分治 附: bzoj mokia AC代码 二维数据 ...

随机推荐

  1. HDU5716, HDU5745【dp+bitset】

    DP+bitset  HDU5716 dp[i][j] = dp[i-1][j-1] && (s[i] in set[j]); 第二维压bitset #include <bits ...

  2. Java编程思想学习笔记_2(继承和多态)

    静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...

  3. Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

    这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...

  4. 浅谈 MVP in Android

    一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等.本篇博文仅是为了做下记录,提出一些自己的看法,和帮 ...

  5. linux 静态库、共享库

    http://blog.chinaunix.net/uid-26833883-id-3219335.html http://blog.chinaunix.net/uid-23069658-id-314 ...

  6. HTML CSS 常用英语单词

    head 头部              body  身体            title 标题            table表格            list 列表            i ...

  7. 开机使用root用户登录

    有的fedora版本默认不支持开机以root用户登录,这是出于安全机制的考虑,可以通过设置实现开机root用户登录 步骤: 1.修改.etc/pam.d/gdm文件,注释掉auth  pam_succ ...

  8. Machine Learning - 第3周(Logistic Regression、Regularization)

    Logistic regression is a method for classifying data into discrete outcomes. For example, we might u ...

  9. 初接触eclipse和前后端调试问题 待续

    1.eclipse得连上服务器(tomcat).有JDK,才能跑起来.跑起来之后在本地localhost的行为eclipse的控制台上就可以看到,同样eclipse上对代码有所改动,浏览器上的loca ...

  10. node.js关于传送数据的二三事

    配置好node环境后 书写代码 目录结构: . 代码: <!DOCTYPE html> <html lang="en"> <head> < ...