• 2024-10-1120241011 大二上 数据结构与算法 堆
    1.堆排序堆排序是一种原地排序算法,即不需要额外的空间来存储数据,只需要在原数组上进行操作即可。堆排序是一种不稳定排序算法,即可能会改变相同元素的相对顺序。例如,如果数组中有两个相同的元素,它们可能会在排序过程中被交换,导致它们的顺序发生变化。堆排序的时间复杂度为O(nlog
  • 2024-10-10各排序算法处理速度比较及稳定排序
    排序方法平均时间复杂度最坏时间复杂度选择排序O(n^2)O(n^2)插入排序O(n^2)        O(n^2)冒泡排序O(n^2)O(n^2)堆排序O(nlogn)O(nlogn)归并排序O(nlogn)O(nlogn)快速排序O(nlogn)O(n^2)稳定排序是指包含相同的数据在排序前的顺苏于排序后的顺序是保持一致的
  • 2024-10-05各种排序算法相关性质整理
    排序算法稳定性最优时间复杂度平均时间复杂度最坏时间复杂度空间复杂度选择排序不稳定\(O(N^2)\)\(O(N^2)\)\(O(N^2)\)\(O(1)\)冒泡排序稳定\(O(N)\)\(O(N^2)\)\(O(N^2)\)\(O(1)\)插入排序稳定\(O(N)\)\(O(N^2)\)\(O(N^2)\)\(O(1)\)计数排序
  • 2024-08-15算法中的大O记法
    目的我们常需要描述特定算法相对于n(输入元素的个数)需要做的工作量。在一组未排序的数据中检索,所需的时间与n成正比;如果是对排序数据用二分检索,花费的时间正比于logn。排序时间可能正比于n2或者nlogn。我们需要有一种方式,用它能把这种说法弄得更精确,同时又能排除掉其中的一些
  • 2024-07-27深度自同构
    朴素筛法的复杂度为调和级数的复杂度,也就是O(nlogn),对于\(n=10^6\)来说,小常数的O(nlogn)算法完全可以通过,线性欧拉筛法则可以处理\(n=10^7\)的情况通过新增虚拟根节点,将森林转化为树本地测试输出\(10^6\)个数需要2s,但OJ评测完全可以通过记得给f[n+1]取模点击查看代码#inc
  • 2024-07-037.1 lxl DS Day1 题解
    7.1lxlDSDay1题解P7124[Ynoi2008]stcm性质1:考虑轻儿子的子树和为\(O(nlogn)\)。证明:考虑每个结点会对多少个轻祖先做贡献,也就是重链个数,考虑每个节点到根节点重链条数为\(O(nlogn)\),所以子树和为\(O(nlogn)\)。所以对于一条重链,如果我们已经插入了链头的补集,
  • 2024-05-29狄利克雷卷积上的特殊情况优于nlogn的做法
    一般函数\(\times\)一般函数\(O(n\logn)\)暴力即可,\(O(n\logn)\)一般函数\(\times\)积性函数\(O(n\log\logn)\)对每一个指数跑类似FWT的东西,\(O(n\log\logn)\)积性函数\(\times\)积性函数\(O(n)\)如果我们能把每一个质数\(p^a\)的答案得到,我们就能欧拉筛
  • 2024-04-26NlogN 求最长不下降子序列(LIS)
    最长不下降子序列是一道非常经典的题目,我们假设题目如下:有一个数组$a$,现在要从中抽取一个严格上升的子序列(子序列就是你可以从原序列里删除一些数,保留一部分数得到的新数列)(严格上升也就是不能相等只能递增),现在要求出这个子序列最长有多长?举例来说,假设有一个数组a=[10,9,
  • 2024-04-23快速排序法
    第一种写法:定标杆在起点时间复杂度:平均o(nlogn),最坏o(n^2)代码如下:点击查看代码#include<bits/stdc++.h>usingnamespacestd;voidquick_sort(inta[],intb,inte){if(b>=e)return;inttemp=a[b];inti=b,j=e;while(i<j){
  • 2024-04-053.18
    由数据范围反推算法复杂度以及算法内容一般ACM时间限制是1-2秒这种情况下,c++代码操作次数控制在1e7~1e8下面给出在不同数据范围下,代码时间复杂度和算法如何选择1.n<=30,指数级别,dfs+剪枝,状态压缩dp2.n<=100=>O(n3),floyd,dp,高斯消元3.n<=1000=>O(n2),O(n2logn),dp,二分,朴
  • 2024-04-02leetcode128. 最长连续序列【三种方法; 并查集; hashtable】
    文章目录1O(nlo
  • 2024-02-23最长不下降子序列nlogn做法及其拓展
    最长不下降子序列nlogn做法及其扩展前言&nlogn做法LIS表示最长不下降子序列考虑设\(f_i\)表示LIS长度为i的最小值(具有单调性),对于每个新的x,二分出最大的满足\(f_i\)小于等于x的位置w,更新w+1还有一种单调栈理解法,假若已经维护了一个LIS在单调栈里,对于一个新的x,二分出最大的满足
  • 2023-12-14逛森林
    这是一道模板题首先,对任意时刻,\(u\)->\(v\)这条路径上的点都是不会变动的(就是说,比如,如果某时刻从\(1\)到\(4\)的路径为\(1\)->\(3\)->\(4\),那么对之后的任意时刻,这条路径都是这个,既不会改变顺序,也不会新增节点,更不会删除已有节点),所以我们可以把所有有效的操作一存起来最后再建边
  • 2023-12-09常见算法的复杂度
    算法 平均时间复杂度 最差空间复杂度快速排序nlognlogn归并排序nlognntimsort  nlogn  n堆排序nlogn  1冒
  • 2023-12-09无序对的$gcd$
    \(N\)为上确界,\(n\)为\(a\)数组元素个数,\(D\)为约数个数。方法一\(1.\)求出\(d\),\(d[i]\)表示\(i\)的所有约数(有序)。时间复杂度:\(O(NlogN)\)vector<int>d[N+1];for(inti=1;i<=N;i++)for(intj=i;j<=N;j+=i)d[j].pb(i);\(2.\)求出\(f
  • 2023-11-27O(nlogn)排序算法
    排序算法介绍常见时间复杂度为\(O(nlogn)\)的排序算法1.快速排序分治思想#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N];voidquick_sort(intl,intr){if(l>=r)return;intx=a[l+r>>1],i=l-1,j=r+1;
  • 2023-11-27时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
    归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数组的排序问题,当待排
  • 2023-11-25不常见的排序算法 - 桶排序、计数排序、基数排序
    提到排序,我们最先想到的肯定是常见的那些排序算法:选择排序、冒泡排序、快速排序、归并排序考虑到性能的情况下,我们应该会优先使用快速排序,因为它的平均时间复杂度是O(nlogn),至于归并排序,虽然它也是一个拥有O(nlogn)平均时间复杂的一个算法,但是它的空间复杂度较快排也较为苛刻,它
  • 2023-11-19堆排序
    堆是一种特殊的树形数据结构,它满足以下两个性质:完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或
  • 2023-11-06O(nlogn)复杂度三维偏序
    给定三个长为\(n\)的序列\(a,b,c\),求有多少个二元组\((i,j)\)满足\(a_i<a_j,b_i<b_j,c_i<c_j\)。\(n\leq10^6\)。考虑对\((a,b),(a,c),(b,c)\)分别做一次二维偏序,设它们的偏序数之和为\(S\)。当\((i,j)\)形成三维偏序的时候,\((i,j)\)在三
  • 2023-10-17基于dfn序的O(nlogn)-O(1) lca
    \(dfn\)序的长度是欧拉序的一半,常数较小,并且代码便于理解背诵。让欧拉序求lca成为时代的眼泪。代码部分实现思路来自cqbz_dongjie点击查看代码autominlca=[&](intx,inty){return(dfn[x]<dfn[y])?x:y;};intt=std::__lg(n)+1;std::vector<std::vect
  • 2023-09-20dfs 序 O(nlogn)-O(1) 求 LCA
    学点分树,发现不会询问复杂度\(O(1)\)的LCA。于是被迫递归式学习。我们设\(dfn_i\)表示点\(i\)在dfs过程中第几个被访问到,把点按访问到的顺序排序得到的序列叫dfs序。考虑\(u\)和\(v\)在dfs序上的位置之间的这一段序列有什么。设\(lca(u,v)=x,dfn_u<dfn_v\)。
  • 2023-09-12最长上升子序列----nlogn算法-模板
    #include<iostream>#include<vector>#defineMAX1010usingnamespacestd;vector<int>len;//这里我返回的满足len[k]>=val[i]且k最小的位置//和上文红色部分的描述是等价的,只是变成了更新len[k],而不是len[k+1]intbisearch(intval){intleft=0,right=len.size(
  • 2023-08-22[算法学习笔记] O(nlogn)求最长上升子序列
    朴素dp求最长上升子序列大家应该都会朴素dp求最长上升子序列,简单回忆一下。我们令\(f_i\)表示以第\(i\)位元素为结尾的最长上升子序列长度。满足\(\forallj<i\),则有:\(f_i=max(f_i,f_j+1)[a_j<a_i]\)Explanation:\(a_i\)前面若有多个可以拼接的序列,则拼一个
  • 2023-08-19CF1842D
    原题翻译题目背景生草因为我们想让聚会时间越长越好,所以我们对于从1开始的某一个限制,我们直到他到达了最大时间再把他加入,由此得到答案的上限为\(1\rightarrown\)的最短路,且这个上限是总是可以取到的因此如果这个上限\(>10^{18}\)就可以结束了否则我们考虑以下构建集合的