CDQ 学习笔记
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 学习笔记的更多相关文章
- CDQ学习笔记
CDQ三维偏序 给出n个点(x,y,z) 每个点求出x'<=x,y'<=x,z'<=x的点(x',y',z')有多少个 第一维 快排 第二维 CDQ 第三维 树状数组 CDQ 先按x ...
- 学习笔记 | CDQ分治
目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- 【框架】Django入门学习笔记
教程 Demo 教材2 教材3 [转] Django处理请求的工作机制 记住: 1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py.该文 ...
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- KD-Tree 学习笔记
这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
随机推荐
- 搭建cvs服务器
http://zhangjunhd.blog.51cto.com/113473/78595 http://www.cnblogs.com/lee/archive/2008/10/22/1317226. ...
- Lambda方式左连接有Linq方式左连接
网上查到的直接使用Join+DefaultIfEmpty的方式是错误的,实际生成SQL是两表先内联接,然后再LEFT JOIN.经过查证,参考资料,最终得到如下两种方式的左连接写法: public v ...
- Sql Server 2008 R2数据库中插入中文变成了问号
通过Insert语句插入数据库中,结果中文都变成了乱码.原因是在数据库中有一个属性需要设置,可以通过Sql server manager studio来进行设置,也要可以通过代码来设置 ...
- spring boot 中文文档地址
spring boot 中文文档地址 http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指 ...
- 我所认识的XPath
实例demo 测试demo所需要xml测试数据 <?xml version="1.0" encoding="iso-8859-1"?> <bo ...
- Mac下用tomcat搭建下载服务器
1.下载tomcat 去官方网址: http://tomcat.apache.org/ 下载最新版 2.下载解压后,自己可以随便放在哪个文件夹下,自己记得路径即可.比如Users/你的用户名/Docu ...
- TP5 急速上手 语法规则
Tp5 规则 命名规范 目录和文件名采用‘小写+下划线’,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写 ...
- LeetCode 全解(bug free 训练)
1.Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...
- TensorFlow 调用预训练好的模型—— Python 实现
1. 准备预训练好的模型 TensorFlow 预训练好的模型被保存为以下四个文件 data 文件是训练好的参数值,meta 文件是定义的神经网络图,checkpoint 文件是所有模型的保存路径,如 ...
- 简历编写技巧-java开发工程师简历实战
看到一遍简历编写的文章 想到也快找工作了 早晚能够用上 现在摘录如下 640?wx_fmt=jpeg 工欲善其事,必先利其器,这是自古以来的道理.所以如果想找到一份好的工作,一定要先整理一份好的简历. ...