做到了相关的题,所以来总结一下 以复杂度排序 一、计数排序(n+k) 原理 记录每个数出现次数,依次枚举数的大小 限制 1、输入的数据类型需是区间内有限的,浮点数就不行 2、数的大小在有限范围内 稳定 代码 #include<bits/stdc++.h> using namespace std; int main(){ n=read();
考虑如果边 \((u,w),(w,v)\) 是从 \((u,v)\) 分裂出来的,那么 \((u,v)\) 这条边有一个儿子,儿子是一个二元组为 \(((u,w),(w,v))\)。 容易发现所有本质不同的分裂方案对应所有本质不同的树。 考虑最小割对应什么。对于一个根节点,必须将所有儿子都割完之后才能割掉自己,所以有一个类似
42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色
P4655 分析 发现如果在 \(i,j\) 之间建桥,那么 \((i,j)\) 内的所有柱子都是无用的,代价还需加上 \((i,j)\) 内的所有拆除代价。设 \(dp_i\) 为从 \(1\) 走到 \(i\) 的最小代价,于是转移方程就呼之欲出了: \[dp_i=\min\limits_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+s_{i-1}-s_j\} \],其中 \(s_
斐波那契数列 波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,是指这样一个数列 递推公式如图: 1.最常见递归算法 //最常见的递归 static int Fibo(int n) { if (n == 1 || n == 2) return 1; else
面试准备——DSA 第 7 天 Photo by 丹尼尔·埃利亚舍夫斯基 on 不飞溅 今天我们将讨论 有效括号 问题。这个问题常用于理解 Stack 数据结构。 什么是栈: 它是一种线性数据结构,遵循特定的操作执行顺序。它适用于主体 LIFO(后进先出)。 Image borrowed from Programiz 问题:有效括号
目录一、一维前缀和1.前缀和是啥2.一维前缀的时间复杂度3.一维前缀和公式的推导4.一维前缀和的例题二、二维前缀和1.二维前缀和的时间复杂度2.二维前缀和公式的推导3.二维前缀和的子矩阵的查询4.二维前缀和的例题 一、一维前缀和 1.前缀和是啥 前缀和其实就是用一个数组S存下数组a
其一·线段树(因为是刚刚学的) 思想懂了,构造也会了,但是写的程序就是很奇怪,就算是模版题也要卡好久,感觉码量有点大,如果有哪个地方出错了,很难找出来,调代码的过程十分艰辛。不知怎么才能提升此类问题的准确率,也不知道如何优化自己写代码时的粗心大意。Ps:还要调码风(有大佬说码风太丑了)。
题目传送门 CF传送门 话说这道题咋这么多坑! 具体思路 把全部位置第一次染成黑色的轮次是第几轮,时间复杂度为 \(\varTheta(k)\) ,接着从点 \(1,1\) 一直到点 \(n-1,m-1\) 全部都判断一遍 ,时间复杂度为 \(\varTheta(nm)\) ,总时间复杂度为 \(\varTheta(nm+k)\) 又因为 \(n,m\le 10^3\)
1 低效率排序 1.1 冒泡排序 排序原理:冒泡排序的原理是通过让较大的数依次往后排或往前排,或者是较小的数依次往后排或前排 代码实现: def bubbling(li): for i in range(len(li) - 1): # 排序躺数,比如一个有三个元素的数列需要将两个元素进行排序 for j in range(1, len(li) -
矩阵加速(矩阵快速幂优化):假设我们要求一个数列的第 \(n\) 项 \(F_n\), 递推的时间复杂度是 O(n), 此时,如果我们可以用矩阵乘法的形式(矩阵 A * 矩阵 B 的 n 次方)来求出 \(F_n\), 配合矩阵快速幂,此时的时间复杂度大概为 O(logn * 矩阵大小\(^3\)). 参考题目:斐波那契数列
CF1711D 令直接下大雨的点为关键点。 做法一: 首先有结论:对于发大水的点我们只需要考虑关键点即可。 证明: 对于两个相邻的关键点 \(x_i\) 和 \(x_j\) \((x_i<x_j)\) 。令他们的降水量分别为 \(p_i\) 和 \(p_j\) 。考虑中间的一个点 \(pos\) 。 那么考虑这两个关键点对这三个点的影
P5517 [MtOI2019]幻想乡数学竞赛 \[a_n=\begin{cases} -3,&n=0\\ -6,&n=1\\ -12,&n=2\\ 3a_{n-1}+a_{n-2}-3a_{n-3}+3^n,&n>2 \end{cases}\]注意到这是个常系数非齐次线性递推。 特征方程是 \[r^3-3r^2-r+3=0\\ (r-1)(r+1)(r-3)=0\]解得特征根为 \[r_1=1,r_2=3,r_3=-1 \]那么相伴
数据结构 数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最有效率算法。 利用代码解决实际问题,最重要的是解决问题的效率,主要是两个因素: 空间的分配效率(物理存储结构) 算法的巧妙程度(逻辑结构:一对一线性、一对多树性、多对多关系网) 数据对象在计
一 插入排序 时间复杂度 O(n^2) 空间复杂度O(1) 稳定性:稳定 //插入排序 public static void inSort(int[] arr){ for (int i = 0; i < arr.length; i++) { int tmp=arr[i]; int j = i+1; for (; j >=0 ; j--) { if
数据结构 数据 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合 按照视点不同,把数据结构分为逻辑结构和物理结构 算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的五个基本特性:输入、输出、有穷性
A. Rectangular Queries 题意 给定一个最多包含 \(10\) 个不同数字的 \(n\times n\) 矩阵,依次回答 \(q\) 个询问,每个询问给定了一个子矩阵,问该子矩阵有多少不同数字。 题解 注意只有十个数字,预处理二维前缀和数组\(cnt[k][i][j]\)表示子矩阵 \((1,1) \to (i,j)\)中数字\(k\)的个数
112. 路径总和 代码 DFS var hasPathSum = function(root, targetSum) { //找到没有根了,那么就说明这条路行不通 if(!root){ return false; } //既没有左节点,也没有右节点,则是叶子节点 if(!root.left && !root.right){ return root.val ===
一、时间复杂度 假设数据量是n、则每次查找的数据量分别是n、n/2、n/4、n/8、……n/2^k 。 k就是在找到数据的时候总共缩小的次数、而每次缩小的操作都只涉及两个数的操作、时间时间复杂度就是 n/2^k=1、即只剩一个数据的时候。k=log2n、所以时间复杂度就是O(logN)。 二、使用条件
欧拉函数,枚举 Problem - E - Codeforces 题意 给定整数 \(n(1<=n<=10^5)\), 对于所有的正整数三元组 \((a,b,c)\) ,求 \(lcm(c,gcd(a,b))\) 的和 思路 对于数论题可以多尝试几种枚举顺序,可能会利用到某些性质优化 首先若枚举 c, 再枚举 a, 复杂度为 \(O(n^2)\) 枚举 a, b 也是 \(O(
排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序。 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1在前。排序过后,倘若a1始终在前,则算法是稳定的,否则是不稳定的。 稳定的 冒泡排序、插入
第2章 排序 2.1 什么是排序 将输入的数字按照从小到大的顺序进行排列 2.2 冒泡排序 从右开始, 两两比较. 逐渐将最小值移动到最左侧 再从最左侧逐步往左移动, 直至所有数字均完成排序 时间复杂度 O(n²), 比较n²/2次 2.3 选择排序 直接寻找最小值, 然后将最小值直接与最左侧数
1. LIS with Stack difficulty 非常恐怖的题,但是远没有这么难。 考虑对于确定的序列 \(a_1,a_2,...,a_n\) 来说,如何判断 \(a\) 能否栈排序。 容易发现 \(a\) 可以栈排序的充要条件是不存在 “\(2-3-1\)” 型的子序列,即不存在三个位置 \(i\lt j\lt k\) 满足 \(a_k\lt a_i\lt a_j\)
多源最短路(在曼哈顿图中)(无例题)(使用BFS,队列): 操作的地图要有两个特点:既可以表示结果中所要的最短距离,又能记录这个点是否走过,那就全部memset为一个特殊的数-1(这里一定要专门设计一个结果图,不能只用最初的图,让最初的图承担三个责任,它哪里做的到啊(表示举例,判重,记录最初信息)(非要做
众所周知,区间 kth 有很多种求法。 本文中的时间复杂度和分数均以实现 P3834 为准。 为了更好地贴合现实,本文代码将更加符合学此算法时的实际情况。 一、排序 通过选择 / 冒泡 / 插入排序,将区间排序后输出 k 小值。 时间复杂度 \(O(mn^2)\) 实际得分:50 分 用时:7.81s #include<cstdi