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 ...
随机推荐
- Python全栈面试题
Mr.Seven 博客园 首页 新随笔 联系 订阅 管理 随笔-132 文章-153 评论-516 不吹不擂,你想要的Python面试都在这里了[315+道题] 写在前面 近日恰逢学生毕 ...
- Vue-router使用
Vue路由:--------------------------------------------------------1 .Vue-rouer入门2 .子路由3 .路由传参4 .多路由区域操作5 ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- 如何从“点子”落地到“执行”?—完整解析1个手游传播类mini项目的进化
本文来自网易云社区 作者:林玮园 从点子到落地,是不确定到确定的过程,是从模糊概念到具体现实的实现过程.无论什么点子,在落地变现的过程中都会有很多疑问产生. 首先,不确定点子本身是否成立.点子的背后是 ...
- JavaScript序列化对象成URL格式
http://access911.net/fixhtm/72FABF1E15DCEAF3.htm?tt=
- 《剑指offer》题解
有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 提交的源码可以在此repo中找到:h ...
- (原)MongoDB在系统中的使用
序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择. 一)结构类型 传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结 ...
- Ubuntu 手机 app开发学习0
# 相关网址 http://developer.ubuntu.com/zh-cn/apps/sdk/ 0. 环境搭建 首选需要一个Ubuntu 14.04操作系统.没啥好讲的,直接安装了一个虚拟机. ...
- C++学习004-Go To 语句使用
C++中,goto语句主要负责语句的跳转,可以用在循环中跳出循环 注意gotu语句是无条件跳转,用的时候一定要谨慎,一定要少 编写环境 Qt 5.7 for(int i = 0;i<100;i+ ...
- Django入门与实战
第1章 介绍课程目标及学习内容 1-1 课程介绍: 第2章 课前准备 2-1 课前准备: 第3章 开发环境搭建 3-1 开发环境搭建: 第4章 创建项目及应用 4-1 创建项目,并了解项目目录下的部分 ...