简介

CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\).

它可以用来顶替一些高级(log)数据结构等.

一般地, CDQ分治分为三部分:

  1. 递归左右区间
  2. 统计左区间对右区间的贡献
  3. 合并整个区间

或者:

  1. 递归左右区间
  2. 分别合并左, 右区间
  3. 统计左区间对右区间的贡献

这两种方法一般来说是等价的.

详见代码.

代码

利用cdq分治求三维偏序.

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll; //---------------------------------------
const int nsz=1e5+5,ksz=2e5+5;
int n0,n=0,k,ans[nsz]; struct tl{int a,b,c,cnt,res;}line[nsz]{{-1,-1,-1,0,0}};
bool cmpa(tl a,tl b){return a.a!=b.a?a.a<b.a:a.b!=b.b?a.b<b.b:a.c<b.c;}
bool cmpb(tl a,tl b){return a.b!=b.b?a.b<b.b:a.c<b.c;}
bool eq(tl a,tl b){return a.a==b.a&&a.b==b.b&&a.c==b.c;} //bit
int bit[ksz];
#define lb(p) ((p)&(-(p)))
void add(int p,int v){while(p<=k)bit[p]+=v,p+=lb(p);}
int qu(int p){
int res=0;
while(p)res+=bit[p],p-=lb(p);
return res;
} //第一种方式
tl l2[nsz];
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);
cdq(mid+1,r);
int pl=l,pr=mid+1;
rep(i,l,r){
if(pl<=mid&&(pr==r+1||line[pl].b<=line[pr].b)) //important: <=
add(line[pl].c,line[pl].cnt),l2[i]=line[pl++];
else
line[pr].res+=qu(line[pr].c),l2[i]=line[pr++];
}
rep(i,l,mid)add(line[i].c,-line[i].cnt);
rep(i,l,r)line[i]=l2[i];
} //第二种方式
void cdq1(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq1(l,mid);
cdq1(mid+1,r);
sort(line+l,line+mid+1,cmpb);
sort(line+mid+1,line+r+1,cmpb);
int p=l;
rep(i,mid+1,r){
while(line[p].b<=line[i].b&&p<=mid)add(line[p].c,line[p].cnt),++p;//important: <=
line[i].res+=qu(line[i].c);
}
rep(i,l,p-1)add(line[i].c,-line[i].cnt);
} int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n0>>k;
rep(i,1,n0)cin>>line[i].a>>line[i].b>>line[i].c;
sort(line+1,line+n0+1,cmpa); rep(i,1,n0){
if(!eq(line[i],line[n]))line[++n]=line[i];
++line[n].cnt;
} cdq(1,n);
// rep(i,1,n)printf("%d %d %d %d %d\n",line[i].a,line[i].b,line[i].c,line[i].cnt,line[i].res); rep(i,1,n)ans[line[i].res+line[i].cnt-1]+=line[i].cnt;
rep(i,0,n0-1)cout<<ans[i]<<'\n';
return 0;
}

[模板] CDQ分治&&BZOJ3262:陌上花开的更多相关文章

  1. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  2. bryce1010专题训练——CDQ分治

    Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...

  3. 【BZOJ3262】陌上花开(CDQ分治)

    [BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...

  4. 【BZOJ3262】陌上花开 cdq分治

    [BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

  5. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1439  Solved: 648[Submit][Status][Discuss ...

  6. bzoj3262陌上花开 cdq分治

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2794  Solved: 1250[Submit][Status][Discus ...

  7. bzoj3262 陌上花开 cdq分治(入门)

    题目传送门 思路:cdq分治处理偏序关系的模板题,主要就是学cdq分治吧,还在入门中. 代码其实也很好理解,记得树状数组操作的上限是 z的最大值,不是n的最大值,这个细节wa了好久. #include ...

  8. BZOJ3262 陌上花开 —— 三维偏序 CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit ...

  9. bzoj3262陌上花开 cdq分治入门题

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

随机推荐

  1. Node.js面试题之2017

    译者按: 从ECMAScript标准,Node.js语法以及NPM模块角度来看,Node.js的发展让人目不暇接,那么面试题也得与时俱进. 原文: Node.js Interview Question ...

  2. 华为有AI,这场转型战有点大

    华为有AI,这场转型战有点大 https://mp.weixin.qq.com/s/qnUP5cgbNxXcAT82NQARtA 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为有AI ...

  3. Android ION内存分配

    The Android ION memory allocator 英文原文 ION heaps ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display c ...

  4. No module named "Crypto",如何安装Python三方模块Crypto

    前两天公司公司老总让我研究怎么用企业微信第三方应用进行官网对接,完成URL回调验证问题. 具体如何进行Python 的Django网站与企业微信第三方应用进行回调验证的博客地址为:https://ww ...

  5. CTS问题分析6

    遇到一个Android P相关的问题,和原来CTS/GTS 问题分析1的表现是一样的,但是将 这个修复cp过来,发现不生效,仍然报错,因此记录一下 问题初探 测试命令: run gts -m GtsG ...

  6. Linux 环境下 Git 安装与基本配置

    索引: 目录索引 参看代码 GitHub: git.txt 一.Linux (DeepinOS) 环境 1.安装 sudo apt-get update sudo apt-get install gi ...

  7. fiddler几种功能强大的用法

    参考网址: http://caibaojian.com/fiddler.html http://www.cnblogs.com/tangdongchu/p/4178552.html 1.fiddler ...

  8. [20190415]11g下那些latch是共享的.txt

    [20190415]11g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...

  9. System.map文件的作用

    有关System.map文件的信息好象很缺乏.其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要.但是由于缺乏必要的文档说明,使其显得比较神秘.它就象耳垂,我们每个人都有,但却不知道是干什 ...

  10. 电信中兴F460光猫sendcmd命令

    1.安装xshell后,使用命令行登陆root用户,root用户密码Zte521(湖北地区) 2.查看所有用户密码  sendcmd 1 DB p DevAuthInfo 3.打开网页登陆teleco ...