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 ...
随机推荐
- PowerPC为什么会没落,我自己的反思学习总结
PowerPC为什么会没落? Intel通过酷睿,拉大优势,使得苹果抛弃PowerPC PowerPC当年异常强大,曾经是Xbox的处理器,是Mac的处理器,占据了服务器的半壁江山:当时刚刚接触C ...
- 如何从海量IP中提取访问最多的10个IP
算法思想:分而治之+Hash 1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理: 2.可以考虑采用分而治之的思想,按照IP地址的Hash(IP) % 1024的值,把海量IP日 ...
- Solution to LeetCode Problem Set
Here is my collection of solutions to leetcode problems. Related code can be found in this repo: htt ...
- 使用IDEA快速搭建Gradle项目
- libvirt保持虚拟机运行情况下修改名称
通过virsh list命令能看到虚拟机的列表: [root@compute2 ~]# virsh list Id 名称 状态 ------------------------------------ ...
- 机器学习 (三) 逻辑回归 Logistic Regression
文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人 ...
- Truffle基础篇-Truffle做什么的?怎么安装?
Truffle基础篇-Truffle做什么的?怎么安装? truffle资料汇总 http://truffle.tryblockchain.org/truffle3.0-integrate-nodej ...
- 在ubuntu下 使用Jetty 和 Maven 开发 HelloWorld
1 安装JDK 我以前安装过,这里就不说了. 2 安装maven 去官网下载 解压 添加环境变量 gedit ~/.bashrc export JETTY_HOME=/home/roc/libs/ ...
- unity 归纳
1.获取控件四个角在屏幕上的坐标 Vector3[] corners = new Vector3[]; gameObject.GetComponent<RectTransform>().G ...
- mysql与hive2.1.1安装和配置
1.mysql安装 这个安装很简单,是在线安装,只需要按顺序执行一下几个命令就ok了. (1)sudo apt-get install mysql-server (2)sudo apt-get ins ...