因为我对CDQ分治理解不深,所以这篇博客只是我现在的浅显理解有任何不对的,希望大佬指出。


首先就是CDQ分治适用的题型:

(1)带修改,但修改互相独立

(2)必须允许离线

(3)解决数据结构的题,能把在线的数据结构吊打


CDQ分治更多的是一种思想,所以就更加没有模板了,只有一个大体的构造在那里。

下面就说一下CDQ分治的基本思想(我的认为):

CDQ分治本质上就是按时间分治,即把各个操作按时间排序然后进行处理。


其实把这个思想说出来真的不好弄,就看一道经典例题来观察一下什么是CDQ分治

题目描述:

基本思路:

这道题就是CDQ分治的必做题,三维偏序,一句话题解就是:CDQ分治第一维,归并排序第二维,数据结构第三维。即CDQ分治保证第一维有序,在这个前提下对这个序列进行归并排序,这样能保证第二维有序,在归并排序加入的过程中用数据结构存储第三维的信息,这样查找数据结构上的信息也就使得第三维有序。

代码实现:

(不确定这个代码会成为我的最终版代码)







文本版:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
struct node{
int x,y,z,size,ans;
node(int _x = 0,int _y = 0,int _z = 0,int _size = 1,int _ans = 0){
x = _x, y = _y,z = _z,size = _size,ans = _ans;
}
}a[MAXN],c[MAXN];
int cnt,n,k,tree[MAXN],ans[MAXN];
int lowbit(int x){
return x & (-x);
}
void Add(int x,int y){
while(x <= k){
tree[x] += y;
x += lowbit(x);
}
}
int get_sum(int x){
int res = 0;
while(x){
res += tree[x];
x -= lowbit(x);
}
return res;
}
bool cmp_x(node l,node r){ //因为我们会进行去重,所以这里应该按顺序一个个全排
if(l.x != r.x)
return l.x < r.x;
if(l.y != r.y)
return l.y < r.y;
return l.z < r.z;
}
bool cmp_y(node l,node r){
if(l.y != r.y)
return l.y < r.y;
return l.z < r.z;
}
void cdq(int l,int r){
if(l >= r)
return;
int mid = (l + r)>>1;
cdq(l,mid);cdq(mid+1,r);
sort(c+l,c+mid+1,cmp_y);sort(c+mid+1,c+r+1,cmp_y);
int i = mid+1,j = l;
while(i <= r){
while(j <= mid && c[i].y >= c[j].y){
Add(c[j].z,c[j].size);
j++;
}
c[i].ans += get_sum(c[i].z);
i++;
}
for(int h = l; h < j; h++){
Add(c[h].z,-c[h].size);
}
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cin>>n>>k;
for(int i=1; i<=n; i++){
cin>>a[i].x>>a[i].y>>a[i].z;
}
sort(a+1,a+n+1,cmp_x);
c[++cnt] = a[1];
c[cnt].size = 1;
for(int i=2; i<=n; i++){
if(a[i].x != a[i-1].x || a[i].y != a[i-1].y || a[i].z != a[i-1].z){
c[++cnt] = a[i];
c[cnt].size = 1;
}
else{
c[cnt].size++;
}
}
cdq(1,cnt);
for(int i=1; i<=cnt; i++){
ans[c[i].ans + c[i].size - 1]+=c[i].size;
}
for(int i=0; i<n; i++){
printf("%d\n",ans[i]);
}
return 0;
}

【学习笔记】CDQ分治(等待填坑)的更多相关文章

  1. 学习笔记 | CDQ分治

    目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...

  2. [学习笔记] CDQ分治 从感性理解到彻底晕菜

    最近学了一种叫做CDQ分治的东西...用于离线处理一系列操作与查询似乎跑得很快233 CDQ的名称似乎源于金牌选手陈丹琦 概述: 对于一坨操作和询问,分成两半,单独处理左半边和处理左半边对于右半边的影 ...

  3. [学习笔记]CDQ分治和整体二分

    序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...

  4. [学习笔记] CDQ分治&整体二分

    突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...

  5. 学习笔记——CDQ分治

    再次感谢这位大佬的博客:https://www.cnblogs.com/ljc20020730/p/10395866.html CDQ分治,是一种在分治合并中计算前面值对后面答案的贡献的一种算法.今天 ...

  6. Python3+Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )

    !/usr/bin/env python -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )'''from selenium im ...

  7. CDQ分治_占坑

    准备系统地学习一波CDQ分治,持续更新中... 首先,CDQ分治也还是分治的一种,只不过普通分治是独立的解决两个子问题,而CDQ分治还要计算第一个子问题对于第二个的影响. CDQ分治几乎都是用来解决多 ...

  8. 算法笔记--CDQ分治 && 整体二分

    参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...

  9. 准备写一些读书笔记,最近在填坑 SQL学习指南 Spring in Action effective Java

    把一些读书的理解通过白板图的形式展示出来,加深自己的认识, 因为目前没有工程项目练手,暂时在学习中把这些知识深化认识一下

随机推荐

  1. 27.Java 飞机游戏小项目

    开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...

  2. C# 操作ie网页,注入JavaScript等操作

    之前做过一个录制鼠标键盘并回放的功能,使用的关键技术是钩子程序.在实现针对指定页面进行录制的过程中,发现C#操作网页的功能. https://www.cnblogs.com/wangchuang/ar ...

  3. js常用方法集合

    1.数组去重 // 思路:获取没重复的最右一值放入新数组 /* * 推荐的方法 * * 方法的实现代码相当酷炫, * 实现思路:获取没重复的最右一值放入新数组. * (检测到有重复值时终止当前循环同时 ...

  4. 运筹学之"概率"和"累计概率"和"谁随机数"

    概率 = 2/50 = 0.2 累计概率 = 上个概率加本次概率 案例1 概率=销量天数 / 天数 = 2 /100 = 0.02 累计概率 = 上个概率加本次概率 = 0.02 +0.03 = 0. ...

  5. eclipse开发工具之“指定Maven仓库和setting.xml文件位置”

    1.先点击window,然后选择Preferences按钮进入设置 2.找到Maven,选择UserSettings 点击Browse控件,添加setting.xml 点击Reindex控件,添加依赖 ...

  6. c++中的printf、和cout和cin后面跟指针的问题

    printf里面打印指针的问题 而在c语言中,使用printf只需要使用不同的格式就可以区分打印出是字符串还是指针变量的值: cout和cin后面跟指针的问题 cout<<mm 和cin& ...

  7. Arduino 烧写bootloader

    什么是bootloader 一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader.这样每次 ...

  8. css 垂直居中方法汇总

    查看原文可以有更好的排版效果哦 前言 居中是平时工作中的最常见的一种需求,各种图片居中或者各种弹窗,水平居中还好,特别是垂直居中,很多初学者表示太难写了,现在列举一些常用的方法. 实战 这里只讲述cs ...

  9. 用纯CSS美化radio和checkbox

    Radio和checkbox需要美化吗?答案是必须的,因为设计风格一直都会变化,原生的样式百年不变肯定满足不了需求. 先看看纯CSS美化过后的radio和checkbox效果:查看. 项目地址:mag ...

  10. 【转载】10个Web3D可视化精彩案例

    1.化学元素周期表 六种排列方式,炫酷动画效果,TWaver 3D轻松实现. 演示地址:http://demo.servasoft.com/che... 2.DNA螺旋图 DNA3D模型,包含几千个球 ...