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

CDQ分治学习笔记

时间:2024-02-13 10:22:20浏览次数:33  
标签:偏序 题意 静态 分治 mid 笔记 CDQ 思路

CDQ 分治

其实CDQ本质就类似线段树,\(i\)的贡献由\(1\)到\(i-1\)在线段树上拆出的log个节点组成,然后将可以被同一段区间做贡献的点一起计算从而保证复杂度。

例题:

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

题意:对于\(k\in[1,n]\)求三维偏序数量为\(k\)的点的个数。

思路:其实就是求每个点的三维偏序数量,可以考虑先按一维排序,然后就只用求二维偏序数量,然后就可以直接CDQ了。

具体来说,先递归处理左右区间,然后考虑计算\([l,mid]\)对\([mid+1,r]\)的贡献。分别将\([l,mid],[mid+1,r]\)按一维排序,然后用双指针保证此时\([l,j]\)的第一维小于当前计算的点,然后用树状数组维护第二维有多少点,直接查询即可。操作完要把树状数组上的操作撤回。复杂度\(O(n\log^2n)\)。

P3157 [CQOI2011]动态逆序对

题意:给定一个排列,每次会删掉一个点,求每次删前的逆序对个数。

思路:发现每个点对\((i,j)\)会做贡献当且仅当\(t_i<t_j,p_i<p_j,pos_i>pos_j\)或\(t_i<t_j,p_i>p_j,pos_i<pos_j\),发现这可以直接三维偏序解决。

复杂度:\(O(n\log^2n)\)。

P4169 [Violet]天使玩偶/SJY摆棋子

题意:动态加点和查询与一个点曼哈顿距离最近的点的距离是多少。

思路:考虑把\(dis(A,B)=|A_x-B_x|+|A_y-B_y|\)的绝对值拆开,其实本质就是把每个点左下、左上、右上、右下四个部分分开来讨论,然后就转化成了求\(\min\limits_{x_j<x_i,y_j<y_i}(x_i+y_i-(x_j+y_j))\),直接用CDQ即可。发现第三维求的是前缀的max,可以用树状数组减小常数。

[SDOI2011]拦截导弹

题意:求最长二元不上升子序列长度和每个点处在最长上升子序列中的概率。

思路:考虑朴素DP,设\(f1_i\)表示以\(i\)结尾的最长二元上升子序列长度,\(g1_i\)为其数量,\(f2_i\)和\(g2_i\)表示以\(i\)开头,那么\(\max f1_i\)为第一问答案,\([f1_i+f2_i-1=maxn]\dfrac{g1_i\times g2_i}{sum}\)为第二问答案,其中\(maxn=\max f1_i,sum=\sum g1_i\)。可是直接这样做是\(O(n^2)\)的,我们考虑用CDQ优化。考虑\([l,mid]\)对\([mid+1,r]\)的贡献,用数据结构维护出当前最大的\(f1_i,g1_i\),然后直接查询最大值更新答案即可。

P4390 [BalkanOI2007] Mokia 摩基亚

题意:矩形加,查询矩形和。

思路:把询问差分一下就是普通三维偏序了,直接套板子即可。

P3658 [USACO17FEB]Why Did the Cow Cross the Road III P

题意:给出两个排列 \(A,B\) ,相等的数之间连线,求数对 \((i,j)\) 的个数。其中 \((i,j)\) 满足:它们所在两个排列间对应的线交叉且 \(\mid i-j\mid>k\) 。

思路:(一开始把题目看错了,知道交上去WA了才发现)也是裸的三维偏序,只是第三维查询是注意一下即可。

CF848C Goodbye Souvenir

题意:单点改,求区间内出现过的数最后一次出现的时间减去第一次出现的时间之和。

思路:(最开始一直不知道怎么转化,知道怎么转化后发现此时很简单)。我们求出每个点的前驱,记为\(pre_i\),那么问题就是求所有满足\(i\in[l,r],pre_i\in[0,l)\)的\(i-pre_i\)之和,于是用set来维护一下前驱后继,就可以直接三维偏序求解。

P5621 [DBOI2019]德丽莎世界第一可爱

题意:求四维权值最大不降链。

思路:发现比三维偏序多了一维,于是考虑CDQ套CDQ。先整体按第一维排序,然后还是考虑\([l,mid]\)对\([mid+1,r]\)的贡献,这又是一个三维偏序问题,于是把\([l,mid]\)的点标记一下,再对\([l,r]\)进行一次CDQ,之后再还原即可。

P3206 [HNOI2010] 城市建设

题意:带修改边权的最小生成树。

思路:CDQ 分治神题。

考虑对时间进行分治。假设当前考虑到区间 \([l,r]\),我们把边分成两种,一种是没有修改的静态边,一种是动态边,此时可以先处理静态边。有一些静态边没有其他的静态边优,那么以后也不会再使用,同时会有一些静态边连接动态边连通块,那么这些静态边一定会在 MST 中,于是我们就要删掉不会再出现的边,然后把一定会加入的边在静态边集中缩点。可以证明此时剩下的静态边和动态边的数量大致相等。

考虑怎么将 \([l,r]\) 分成 \([l,mid]\) 与 \([mid+1,r]\)。这里就是简单的将 \([mid+1,r]\) 中没有修改的边当成 \([l,mid]\) 中的静态边,反过来同理。对于最后一条动态边,修改权值然后更新答案即可。

复杂度 \(O(n\log^2n)\)。

「JOISC 2014 Day3」稻草人

题意:平面上有 \(n\) 个稻草人,求有多少个和坐标轴平行的长方形满足左上角和右下角是稻草人且内部(不含边界)没有稻草人。

思路:考虑 CDQ 分治,那么此时我们要统计的就是左下角在 \([l,mid]\),右上角在 \([mid+1,r]\) 的矩形个数,考虑按 \(y\) 从大到小加入左侧点,维护 \(x\) 递减的单调栈,这样可以求出以这个点为左下角的矩形的纵坐标上界,然后再右边维护横坐标递增的单调栈,就可以求出答案了。

标签:偏序,题意,静态,分治,mid,笔记,CDQ,思路
From: https://www.cnblogs.com/Xttttr/p/18014366

相关文章

  • FWT学习笔记
    FWTFWT即位运算卷积,用来快速计算形如\(\sum\limits_{i\oplusj=k}f_ig_j\),其中\(\oplus\)表示某种位运算。设FWT(A)是幂级数A经过\(\rmFWT\)变换之后得到的幂级数。我们需要令其满足:\(A*B=C\LongleftrightarrowFWT(A)·FWT(B)=FWT(C)\)(点积)。\(\rmFFT\)是......
  • 网络通信基础知识学习笔记
    一.图解网络为什么需要TCP/IP网络模型:为了适应互联网环境下多种多样的设备,设计的一套通用的网络协议对于同一台设备进程间的通信方式:管道,消息队列,共享内存,信号量TCP/IP网络模型的分层:应用层:用户能够直接接触到的层次,互联网软件都是在应用层进行实现.......
  • risinglight-tutorial 学习笔记
    01-01hello-sql该示例提供了一个将Sql解析为语法树并返回select'hello';中字符串的逻辑其核心逻辑如下:pubfnrun(&self,sql:&str)->Result<Vec<String>,Error>{//parse--借用开源的PostgreSqlDialect进行Sql的解析//来自sqlparser-0.13.0......
  • 读千脑智能笔记12_阻止人类灭绝
    1. 阻止人类灭绝1.1. 宇宙中唯一知道这些的物体,唯一知道宇宙存在的物体,是我们的大脑1.2. 如果没有关于某个事物的知识,我们能说这个事物就一定存在吗?1.2.1. 我们的大脑扮演着这样一个独特的角色,这很令人着迷1.3. 30%的大脑,即旧脑,是由许多不同部分组成的1.3.1. 旧脑......
  • 2024/2/12学习进度笔记
    sparkrdd持久化frompysparkimportSparkContext,SparkConfimportosimportrefrompyspark.storagelevelimportStorageLevelos.environ['SPARK_HOME']='/export/server/spark'PYSPARK_PYTHON="/root/anaconda3/envs/pyspark_env/bin......
  • Suffix Array:后缀数组学习笔记
    后缀排序后缀排序,顾名思义就是给后缀排个序。朴素做法是\(O(n^2\logn)\)的,无法接受。因此诞生了基于倍增思想的后缀排序算法。其中倍增思想在集训队论文中讲得很好,在此不再赘述。这里主要讲代码实现。constintN=2e6+10;chars[N];intn,m,sa[N],rk[N],tp[N],b[N];void......
  • 图论笔记
    最短路相关最短路基础\(\mathbf{Floyed}\)求最短路本质上是dp。设\(f(w,i,j)\)表示当前松弛到第\(w\)轮,\(i\rightarrowj\)的最短路是\(f(w,i,j)\)。转移显然是:\[f(w,i,j)=f(w-1,i,k)+f(w-1,k,j)\]\(w\)显然可以滚掉。时间复杂度\(O(n^3)\)......
  • esp32笔记[15]-使用LVGL 9.0显示图片
    摘要在esp32s3上使用LVGL9.0显示图片.关键信息编译环境:ESP-IDFv4.4LVGL:9.0board:酷世DIYESP32S3开发板Link:https://item.taobao.com/item.htm?&id=655913924680flashsize:8MBLCDdriver:ILI9341LCDmodule:2.4TFTSPI240x320v1.2Touchdriver:XPT2046......
  • 树分治
    目录树分治点分治入门1P4178TreeProblemSolutionP4149[IOI2011]RaceProblemSolutionP6626[省选联考2020B卷]消息传递ProblemSolutionP5351RuriLovesMascheraProblemSolutionCF293ECloseVerticesProblemSolution点分治入门2P5306[COCI2018-2019#5]TransportProblemS......
  • 线段树分治学习笔记
    线段树分治线段树分治是一种可以离线处理带撤销问题的常用手段。一般而言,题目中加入操作很好维护,但删除操作不好维护,这时可以对时间维建线段树,把每一个操作加入其存在时间段对应的线段树节点上,然后处理所有询问,进入一个节点时将这个节点里的操作加入,递归左右儿子,然后撤销这一次做......