\(CDQ\)分治小结

标签:知识点总结

阅读体验:https://zybuluo.com/Junlier/note/1326395

身为一个资深菜鸡

\(CDQ\)分治一开始学了一晚上,后来某一天又复习了一晚上(和重新学一样。。。)

现如今才发现自己还有这个坑没有填。。。于是来填坑了。。。

简介定义

\(CDQ\)就是对于问题一层一层分治达到可做状态(懵逼吧)

正儿八经地讲

PS:以下面题目里的三维偏序洛谷模板为准。。。

都做过二维偏序吧。。。

有一种做法是第一维排序,第二维树状数组查询前缀和对吧(或者第二维归并)

我们考虑把二维偏序拓展到三维偏序\((a,b,c)\)

还是考虑第一维排序,第二维则归并排序,第三维我们再套树状数组来解决

那么具体怎么做呢?

把第一位直接在最外层排序一遍,那么\(a_i\)是有序的了对吧

考虑对第二维进行归并,考虑怎么让其帮助第三维统计呢

(PS:这里笔者刚学的时候一直不是很明白,所以希望自己讲仔细一点。。。)

首先思考归并排序是一个怎样的过程,先递归子任务,让左一半和右一半有序,然后直接插排

我们可以借助归并排序这个左右都变得有序的阶段

很显然这个时候左边一段和右边一段是按\((a,b)\)有序的,那么我们直接考虑左边对右边的贡献

也就是说,左边的\(a\)肯定是比右边的\(a\)小的,然后可以在对\(b\)进行插入排序的时候用树状数组统计

以\(b\)为下标,\(c\)为权值构一棵树状数组,每次把左边的\((b,c)\)插入,从右边在树状数组中统计

仔细思考一下,很难马上理解,但应该对你有所帮助\(QwQ\)

可以结合代码看一下(虽然我压行。。。)

#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 100050
using namespace std;
const int Inf=1e9;
il int read()
{
rgt s=0,m=0;rg char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n,K,tot;
int sum[N<<1],ans[N];
struct LJL{
int a,b,c,num,siz;
il int operator !=(const LJL &y)const
{
return a!=y.a||b!=y.b||c!=y.c;
}
}ljl[N],tmp[N];
il int cmp(const LJL &x,const LJL &y)
{//按(a,b,c)排序
if(x.a!=y.a)return x.a<y.a;
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
il void Upd(int loc,int x){for(;loc<=K;loc+=(loc&(-loc)))sum[loc]+=x;}
il int Query(int loc){rgt ret=0;for(;loc>=1;loc-=(loc&(-loc)))ret+=sum[loc];return ret;}
//树状数组部分,打的时候很舒服,看起来般般子 void CDQ(int L,int R)
{
if(L==R)return;rgt mid=(L+R)>>1;
CDQ(L,mid),CDQ(mid+1,R);//归并
rgt i=L,j=mid+1,p=L;
while(i<=mid&&j<=R)
if(ljl[i].b<=ljl[j].b)Upd(ljl[i].c,ljl[i].siz),tmp[p++]=ljl[i++];
else tmp[p]=ljl[j],tmp[p++].num+=Query(ljl[j++].c);
while(i<=mid)Upd(ljl[i].c,ljl[i].siz),tmp[p++]=ljl[i++];
while(j<=R)tmp[p]=ljl[j],tmp[p++].num+=Query(ljl[j++].c);
for(rgt i=L;i<=mid;++i)Upd(ljl[i].c,-ljl[i].siz);
for(rgt i=L;i<=R;++i)ljl[i]=tmp[i];
} int main()
{
n=read(),K=read();
for(rgt i=1;i<=n;++i)
tmp[i]=(LJL){read(),read(),read()};
sort(tmp+1,tmp+n+1,cmp);
for(rgt i=1;i<=n;++i)
{
if(tmp[i]!=tmp[i-1])ljl[++tot]=tmp[i];
++ljl[tot].siz;
}
CDQ(1,tot);
for(rgt i=1;i<=n;++i)ans[ljl[i].num+ljl[i].siz]+=ljl[i].siz;
for(rgt i=1;i<=n;++i)printf("%d\n",ans[i]);return 0;
return 0;
}

给一些题目

上面那些BZOJ都有。。。可以各大OJ多倍经验

CDQ分治总结的更多相关文章

  1. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  2. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  3. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  4. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

  5. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  6. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  7. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  8. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

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

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

  10. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

随机推荐

  1. Burpsuite查看和修改请求

    打开上传测试网页(此处是自己搭建的OWASP平台),这个网页只能上传图片格式的文件 上传一张图片: 查看上传图片: 创建一个test.text文件: 配置浏览器代理,IP:127.0.0.1,端口:8 ...

  2. IDC机房跳线

    服务网卡口与配线架 这里有一根网线 记录方式 签 A:23FM-23U-T07 (配线架网线) B:23FM-23U-NIC1(服务器网线) 在配线架的机柜旁边一定写明了 跳线的对面的   交换和配线 ...

  3. ubuntu日常

    1804 处理 1,修改为固定ip vim /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: ...

  4. jeesite安装时Perhaps you are running on a JRE rather than a JDK

    使用自己本地安装的maven,启动jeesite报错: No compiler is provided in this environment. Perhaps you are running on ...

  5. js怎么上传文件夹

    1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...

  6. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  7. LCA模板 ( 最近公共祖先 )

    LCA 有几种经典的求取方法.这里只给出模板,至于原理我完全不懂. 1.RMQ转LCA.复杂度O(n+nlog2n+m) 大致就是 DFS求出欧拉序 => 对欧拉序做ST表 => LCA( ...

  8. cocos2d 15款游戏源码

    https://blog.csdn.net/jailman/article/details/78678972

  9. 20175221 《Java程序设计》第10周学习总结

    20175221   <Java程序设计>第10周学习总结 教材学习内容总结 第十二章主要内容有: 进程与线程 进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过 ...

  10. C#读取word文档中的内容

    原文地址 http://blog.csdn.net/yhrun/article/details/7674540 在使用前需要添加引用巨硬的com组件:Microsoft Word 12.0 objec ...