首页 > 其他分享 >CDQ 分治学习笔记

CDQ 分治学习笔记

时间:2024-07-17 15:43:05浏览次数:13  
标签:log 分治 mid 笔记 贡献 tim CDQ

CDQ 分治的流程大致是将对于区间 \([l,r]\) 中点 \(x,y\) 的计数分为两类处理:

  1. \(x,y\) 均位于 \([l,mid]\) 或 \([mid+1,r]\) 中,这样的点对贡献可以递归解决。

  2. \(x,y\) 分别位于 \([l,mid]\) 和 \([mid+1,r]\) 中,这样的点对通过一些操作来统计贡献。

显然这两类贡献之和即为 \([l,r]\) 的贡献。

三维偏序

算法流程

首先看一下模板题的削弱版:

有 $ n $ 个元素,第 $ i $ 个元素有 $ a_i,b_i,c_i $ 三个属性,满足所有 \(a_i\) 互不相同,所有 \(b_i\) 互不相同,所有 \(c_i\) 互不相同。设 $ f(i) $ 表示满足 $ a_j < a_i $ 且 $ b_j < b_i $ 且 $ c_j < c_i $ 且 $ j \ne i $ 的 \(j\) 的数量,对于 \(i \in [1,n]\),求出 \(f(i)\)。

下面以此题为例讲解 CDQ 分治的流程。

第一步,对于整个数组以 \(a_i\) 从小到大排序。

第二步,进行 CDQ 分治,递归处理 \(1\) 类贡献,下面计算 \(2\) 类贡献:设当前区间为 \([l,r]\),中点为 \(mid\)。由于上一步已经对 \(a\) 一维排序过了,这意味着对于区间內部有且仅有 \(i \in [l,mid]\) 会对 \(j \in [mid+1,r]\) 的\(f\) 值产生贡献。再分别将 \([l,mid]\) 和 \([mid+1,r]\) 两个区间按照 \(b_i\) 为关键字从小到大排序,这样对于 \(j \in [mid+1,r]\),能对其产生贡献的 \(i\) 一定是 \([l,mid]\) 的一个前缀,将这个前缀的 \(c_i\) 插入树状数组即可查询满足 \(c_j\) 限制的点的个数。显然若按照 \(j\) 的大小从小到大处理,区间内每个 \(i\) 只需要插入一次树状数组。

复杂度分析

设对于长度为 \(n\) 的区间进行 CDQ 分治的时间复杂度为 \(T(n)\),那么有递推式:

\[T(n) = 2T(\dfrac{n}{2}) + O(n \log n) \]

根据 \(\text{Master}\) 定理,对于形如 \(T(n) = a T(\dfrac{n}{b}) + f(n)\) 的时间复杂度递推式,设 \(c=\log_b a\),若存在非负数 \(k\) 满足 \(f(n) = n^c \cdot \log^{k}n\),则 \(T(n) = n^c \cdot \log^{k+1}n\)

观察上面的式子,\(a=2,b=2,c=1,k=1\) 时成立,那么 \(T(n)=n \log^2 n\),总复杂度就是 \(O(n \log^2 n)\)。

P3810 【模板】三维偏序(陌上花开)

与上面一道题的区别在于存在了相等权值。对于两个数对若完全一样,那么就离散化为 \(1\) 个,统计时直接加上个数而不是加 \(1\),在排序时要按 \(a\) 为第一关键字,\(b\) 为第二关键字,\(c\) 为第三关键字,这样能保证一定是左面对右面有贡献。

P3157 [CQOI2011] 动态逆序对

给每个点打上时间戳 \(tim_i\),对于每个点,删去他减少的逆序对数目是他与前面的未删去点构成的逆序对数目(即\(tim_j > tim_i , pos_j < pos_i , val_j > val_i\) 的点对数目),以及后面未删去的点和该点构成的逆序对数目(即\(tim_j > tim_i , pos_j > pos_i , val_j < val_i\) 的点对数目),跑两次 CDQ 分别求这两类即可。

标签:log,分治,mid,笔记,贡献,tim,CDQ
From: https://www.cnblogs.com/victoryang-not-found/p/18307301

相关文章

  • 恢复 iPhone 上误删除笔记的 5 种绝佳方法
    您想知道如何恢复iPhone上误删除的笔记吗?阅读本指南,了解5种简单方法,可直接或通过iTunes/iCloud备份检索iPhone上丢失或删除的笔记。iPhoneNotes应用程序提供了一种方便的方式来记录重要信息,包括文本、图片、链接和许多其他类型的信息。但是,各种原因仍可能导致iPhon......
  • PYTHON学习笔记(二、python结构语句)
    (1)顺序语句结构neme=input('请输入你的名字:')year=eval(input('请输入你的年龄:'))number=eval(input('请输入你的中奖号码:'))print('我爱中国!!')print('我爱CSDN!!')运行终端后,我可以看到以下结果:(2)分支语句结构(if语句的基本格式)neme=input('请输入你的名字:......
  • 服务注册/发现-Eureka-微服务核心组件【分布式微服务笔记02】
    服务注册/发现-Eureka-微服务核心组件【分布式微服务笔记02】服务注册/发现-Eureka目前主流的服务注册&发现的组件是Nacos,但是Eureka作为一个老牌经典的服务注册&发现技术还是有必要学习一下,原因:一些早期的分布式微服务项目使用的是Eureka,在工作中,完全有可能遇到.后......
  • Python学习笔记—100页Opencv详细讲解教程
    目录1创建和显示窗口...-4-2加载显示图片...-6-3保存图片...-7-4视频采集...-8-5视频录制...-11-6控制鼠标...-12-7TrackBar控件...-14-8.RGB和BGR颜色空间...-16-9.HSV和HSL和YUV..-17-10颜色空间的转化...-18-11mat的深......
  • JAVA笔记七
    七、数组1.数组的概念(1)一个具有固定大小,可以容纳相同类型数据的集合(2)数组元素的类型可以是基本类型,也可以是引用类型(3)数组可以认为是Java中最简单的复合类型(4)数组的声明和使用,在语法上与C语言类似,但是在内部实现机制上有本质的区别2.数组的声明int[]arr;或者in......
  • zabbix6.4分离部署笔记
    Zabbix6.4分离部署实施过程一、环境准备三台服务器###操作系统:REDHATENTERPRISELINUX8.3数据库:MYSQL8.0ip地址以及用途:Zabbix前端,8C16G16G系统盘100G:10.0.13.711371zabbixwebZabbix服务后端,8C16G100G:10.0.13.631363zabbixserverZabbix数据库MySql,8......
  • 力扣刷题笔记-删除数组中的重复元素
    纠结要不要离开杭州删除数组中的重复元素思想双指针/快慢指针只有当两个元素不相等的时候才发生复制和p指针向后移动如果两个指针指向的元素相等,则q指针向后移动p和q不相邻的情况下才发生复制和替换,如果相邻,只是简单的q指针向后移动p指针是慢指针,q指针是快指针,当p和q指向......
  • 设计模式之工厂模式(学习笔记)
    定义工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象......
  • 开发基础笔记
    1、Springboot2.0以后默认的数据库连接池是哪个? Springboot2.0以后默认的数据库连接池是哪个SpringBoot2.0后默认的数据库连接池是HikariCP。HikariCP是一个高性能的数据库连接池,它的性能远远超过其他传统的数据库连接池,如C3P0、DBCP和Tomcat的连接池。如果......
  • 利用anki实现电子笔记与滑记手机端/平板端同步
    适用对象:希望利用anki类工具随时复习,但是手机平板端制造卡片成本较高,希望通过电脑端制作卡片并且同步至滑记1,在电脑上下载anki网址:https://apps.ankiweb.net/点击download,选择你要下载的版本2,下载完后,打开anki,并制作卡片滑记在手机平板端也可以制作卡片,但是相比于使用电脑操......