首页 > 其他分享 >CDQ分治

CDQ分治

时间:2024-11-25 18:33:13浏览次数:4  
标签:树状 一半 分治 CDQ 数组 排序

CDQ分治

有n个元素,第 i个元素有ai,bi,ci三个属性,设 f(i) 表示满足 aj ≤ ai且 bj ≤ bi 且 cj ≤ ci且 j != i 的 j 的数量。
求f数组。

解决三维偏序的流程:

同样有归并排序和树状数组两种做法,我们这里给出树状数组做法。

先按一维属性排序和去重

1.假设三维分别是x,y,z,先按x排序。

2.然后去掉重复元素,记录每个元素出现的次数cnt
CDQ分治:类似归并排序的思想,先按第一维属性划分为前一半和后一半,回归时计算前一半对后一半的影响

分治后每次将前一半、后一半分别按y排序。虽然现在x的顺序被打乱了,但是前一半的x还是都小于后一半的,所以只计算前一半对后一半的偏序关系,是不会受到x影响的。

用双指针 i,j来维护前一半和后一半,每次将j后移一位时,若y[i] <= y[j],则不断后移i,并不断将z[i]加入树状数组。然后再查询树状数组中有多少数<=z[j],即<= e[j]的偏序数量。

最后要清空树状数组。

时间复杂度O(nlog^2n)

标签:树状,一半,分治,CDQ,数组,排序
From: https://www.cnblogs.com/water-flower/p/18568353

相关文章

  • 深圳大学-算法设计与分析-实验2-分治法求最近点对问题
    前言说明一门没什么意义的课程,学算法不如直接刷题,这门课纯答辩,本人写的报告也很答辩,可能还有错误,仅供参考,慎抄!实验目的(1)掌握分治法思想。(2)学会最近点对问题求解方法。实验内容对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短......
  • 分治法求最大连续子序列的积
    1.源代码#include<iostream>#include<vector>#include<string>#include<sstream>usingnamespacestd;intmax3(intnum1,intnum2,intnum3){   if(num1>num2){      num2=num1;   }   returnnum2>num3?num2:n......
  • 数据结构与算法篇(回溯&递归&分治 - 刷题篇)(目前一天图片上传太多加载不出来)(后续更新)
    目录1.没有重复项数字的全排列(中等)1.1.题目描述1.2解题思路1.3代码实现方法一:递归方法二:非递归版2.有重复项数字的全排列(中等)2.1.题目描述2.2.解题思路2.3.代码实现递归+回溯(推荐使用)3.岛屿数量(中等)3.1.题目描述3.2.解题思路3.3代码实现方法一:dfs......
  • 线段树分治略解&杂题解析
    可能做到好题之后会再更新吧。总叙线段树与离线询问结合技巧又被称为线段树分治。使用线段树分治维护的信息通常会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。以下是线段树分治的基本模板:change将信息按时间段覆盖在线......
  • 点分治
    感觉非常有深度,感觉过几天就又要忘了,所以我写个题解。P3806【模板】点分治1给定一棵有\(n\)个点的树,询问树上距离为\(k\)的点对是否存在。题意非常简单题意越短越毒瘤。大佬原文我们先想想点对有几种情况:第一种是经过根节点的路径;第二种是不经过根节点的路径;想第一......
  • 洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure
    原题链接:https://www.luogu.com.cn/problem/P6648题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。解题思路:1、枚举法枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。2、倍增和ST思想此题非常类似于RMQ问题,也就是求区......
  • 深入分治法:如何用简单步骤解决复杂问题?
    分治法(DivideandConquer)概述分治法是一种经典的算法设计思想,它将一个复杂问题分成多个规模较小的子问题,分别解决这些子问题,然后将子问题的解组合成原问题的解。分治法的思想非常通用,适用于许多经典算法和问题,如归并排序、快速排序、二分搜索、矩阵乘法等。分治法的基本步......
  • 洛谷题单指南-分治与倍增-P3517 [POI2011] WYK-Plot
    原题链接:https://www.luogu.com.cn/problem/P3517题意解读:有n个连续的点p1,p2,...,pn,将这n个点分成不超过m堆,每堆点连续,每一堆都缩成一个点qi,要使得原来的点p1~ps距离qi的最大值最小(最相似),求这个相似度,并计算一共分成几堆,以及每堆缩到的点qi的坐标。解题思路:要使得若干点缩到一......
  • Datawhale Leecode基础算法篇 task02:递归算法and分治算法
    官方学习文档:datawhalechina往期task01:枚举算法链接:DatawhaleLeecode基础算法篇task01:枚举算法递归算法递归简介递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举......
  • 算法-分治和逆序
    分治法(DivideandConquer)是一种重要的算法设计范式,它通过将复杂的问题分解成更小、更易于管理和解决的子问题,然后递归地解决这些子问题,最后将子问题的解合并以得到原问题的解。分治法通常用于排序、搜索、数学计算和优化等问题。分治法的核心思想可以概括为三个步骤:分......