算法模板
文章平均质量分 79
算法模板题
米莱虾
19软工 Unity3D游研工程师 GameJam亚军
ACM-ICPC国际大学生程序设计竞赛亚洲区域铜牌
全国大学生算法设计与编程挑战赛团队赛金奖rank9
全国大学生算法设计与编程挑战赛个人赛一金一铜
2020&2021全国大学生IT技能大赛国二等奖
2021&2020中国高校计算机大赛总决赛铜牌
亚太经济地区大学生数学建模竞赛二等奖
全国大学生创新促进就业大赛国决三等奖
中国软件智能应用程序设计大赛三等奖
计蒜之道程序设计大赛决赛Rank前列
全国大学生英语竞赛国家三等奖
展开
-
UPC 2021个人训练赛第20场——问题G:Make it Manhattan
题面:题目描述混乱的城市已经变得无法控制。大楼随处乱造,城市的布局也是一片混乱。市长决定要结束这种局面,兵器并且想建造一个漂亮的、有组织的城市。通过一些研究,他找到了使这个成为现实的理想的方法。受到纽约曼哈顿的启发,他希望所有的房子都造在矩形的格子里,用南北向的林荫道和东西向的街道隔开。这些林荫道和街道都有相同的间距。在现在这种状况,房子已经规划在矩形格子里面了。事实上,每幢房子都恰好完全覆盖住一个矩形格子。但是,所有的楼房随机地散落在城市里,不毁坏房屋来造路是不可能的。为了使得更多的市民开心,市长原创 2021-06-12 22:07:10 · 149 阅读 · 0 评论 -
动态规划之4大背包问题详解
多用图文、举例讲解每个背包问题、深入剖析原理&步骤由来、结合经典例题联系&区别不同背包问题的特征、从朴素做法优化至最优做法、附经典普适AC模板原创 2020-10-10 10:51:57 · 644 阅读 · 0 评论 -
动态规划之多重背包【暴力->优化】(实例讲解优化过程&原理)
/*f[i]:总体积是i的情况下,最大价值是多少 for(int i=0; i<n; i++){ for(int j=m; j>=v[i]; j--) f[j] = max(f[j], f[j-v[i]]+w[i], f[j-2*v[i]]+2*w[i]...);} 初始化时,如果把所有状态都初始化为0了,那么f[m]就是答案若只令f[0]=0,其他的都是负无穷,则从f[0~m]中选一个最大值即:1. f[i]=0 f[m]2. f[0]=0, f[原创 2020-10-09 09:06:45 · 285 阅读 · 2 评论 -
动态规划之完全背包【闫氏DP分析法】(联系01背包附图剖析原理)
完全背包和01背包的题目很相似,优化处理后,代码也很相似,但是其中蕴含的道理大相径庭。相似体现在:01背包优化后,第二重循环的 j 由从大到小改为从小到大之后,就能直接应用AC。两者在题目中的不同主要体现在:01背包每种物品只能用一次,而完全背包的每种物品都有无限件可以使用。而他们的内在区别主要体现在:状态计算,即集合的划分(在01背包里,是以第i个物品选或者不选为界分成两个集合; 而在完全背包里,因为第i个物品有无限件可以选择,所以在枚举时,要划分成若干个子集,而不是两个子集)。完全背包的步骤:原创 2020-10-07 15:35:40 · 354 阅读 · 0 评论 -
C++算法之深搜(DFS)【彩色图文思路详解&经典例题&AC代码解析】
经典问题:n个数的全排列、八皇后问题(两种思路)原创 2020-09-30 22:43:46 · 5454 阅读 · 1 评论 -
【C++】组合数学四阶应用场景(分布详解&应用例证)
组合数的计算公式:c(a,b) = ( a*(a-1)* … (a-b+1) ) / (b(b-1)* … * 1) = a! / ( b! * (a-b)! )常用的组合数的递推式:c(a,b)=c(a-1,b)+c(a-1,b-1)给出一个实际的应用场景来解释这个递推式。从a个苹果中选出b个,所有情况都可以分为两大类(选中一个苹果标记为红色,作为 划分的标准)。第一类:选的当中包含红色的【说明还要从剩余的(a-1)个苹果里选出(b-1)个】;第二类:选的当中不包含红色的【说明还要从剩余的(a-1原创 2020-09-28 18:39:19 · 598 阅读 · 0 评论 -
动态规划之01背包【从暴力到优化】
动态规划 ——DP 的介绍动态规划 (DP) 是一种算法技术,它将大问题分解为更简单的子问题,对整体问题的最优解决方案取决于子问题的最优解决方案。有的问题有 2个特征:重叠子问题、最优子结构。用 DP可以高效率地处理具有这 2个特征的问题。处理 DP的大问题和小问题,有两种实现方式 ——自顶向下与记忆化递归 / 自下而上与制表递推。以斐波那契为例,两种实现方式的代码分别如下:// 自顶向下与记忆化递归int memoize[maxn]; //保存结果int fib (int n){原创 2020-09-20 15:29:47 · 349 阅读 · 0 评论 -
数据结构之用数组模拟单链表【分步图文详解&附例题及AC代码】
知识背景与相应介绍先介绍一下单链表单链表可以在任意位置插入,但如果想在 O(1)的复杂度内实现,就只能在某一个点的后面一个点插入。单链表只往后看,不往前看,可以在 O(1)的时间找到下一个节点的位置,但是不能知道上一个节点的位置。因此要找某些点只能从头开始遍历 。链表(和邻接表)可以用指针+结构体的实现方式struct Node{ int val; Node *next; }; //在面试题比较多,笔试题中比较少这种实现方式的 特点:每次创建一个新的链表的时候就要调用一下new函数原创 2020-09-17 20:52:45 · 1624 阅读 · 5 评论 -
C++求平面上不重合的n个点最多构成多少条两两互不平行(包括重合)的直线
对应题目UPC NO.78场 问题 E: 阅兵队形 plane题目描述70 周年阅兵的时候,飞机在空中排练着队形,Yyx 很好奇,他想知道这么训练有素的队形到底是如何造就的呢?他记录下了飞行路径上的各个端点。他发现:把整个天空看做一个平面直角坐标系,飞行路径是所有过任意两个端点的直线。如果这些飞机可能会撞在一起,或者说只要这些直线有交点,就可能发生事故。在所有直线中应该最少删除多少条直线使得剩下的直线两两都不相互平行(重合也是平行)。求出最多可以构成多少条两两互不平行的直线。输入第一行,整原创 2020-08-15 08:28:28 · 748 阅读 · 0 评论 -
求斐波那契前n项平方和 ——矩阵快速幂模板(几何&构造证明题【附图】)
根据图示,我们可以知道:后面的大正方形的边长总是等于前面的小正方形组成的矩形的长;前面几个斐波那契数的平方之和(也就是前面几个小正方形的面积之和)在数值上等于最后出现的一个和下一个紧接着未出现的斐波那契数的乘积(也就是已经出现的小正方形组成的矩形的面积等于其中最大的一个小正方形的边长乘以下一个紧接着未出现的正方形的边长)。对应的公式化简后如下:#include <bits/stdc++.h>#define ll long long#define MOD 1000000007usin..原创 2020-08-13 15:26:07 · 796 阅读 · 0 评论 -
区间合并模板【彩色图示版&附例题+AC代码(全注释)】
与区间有关的问题有很多,大部分都是用贪心的策略去解决,不是按照左端点排序,就是按照右端点排序,或者按照左右端点双关键字排序。先讲一下按照左端点进行排序的,其他的后续跟新。区间合并的应用场景:给出很多个区间,把有交集的区间合并为一个【特殊规定:端点处相交,也算有交集】。这类题目往往让我们输出最终的区间数目或者区间长度的最值,又或者是将所有区间合并的最小花费。要求我们快速实现把有交集的区间合并为一个区间。规定左端点为st,右端点为ed。按照左端点排序,进行区间合并时会遇到下面4种情况,还会遇到特殊的边界处原创 2020-08-08 22:09:03 · 691 阅读 · 4 评论 -
常见的两种位操作及例题讲解【附代码】
位运算最常见的两种操作一: n的二进制表示中第 k位是几注意:k的下标,个位为第0位开始 基本思路:1.先把n的第k位移到个位,n>>k[读作n右移k]2.看一下个位是几,如看x的个位是几:x&1 结合:即n>>k&110的二进制依次右移0~3位为:1010 101 10 1,也就是上述 1二:lowbit,树状数组的一个基本操作作用:返回x的最后一位1 例:x=1010 lowbit(x)=10;x=101000 lowbit(x)=1000原创 2020-07-26 09:14:28 · 454 阅读 · 0 评论 -
两大类 “双指针” 算法剖析【附例题详解+AC代码】
首先,介绍一下双指针算法。我们在用朴素算法暴力解决问题时,通过挖掘某些性质,使得算法复杂度由 O(n^2)->O(n) ,我们把具有这样性质的算法称为双指针算法【其实双指针算法非常广泛,不只是被用在维护两个窗口上,但在这里,我们缩小了它的范围】。常用的两种双指针算法的类型:一种是: 两个指针分别指向两个序列 ( “归并排序” 就用到了这一种指针,具体操作:每一次分别移动两个指针,两个指针移动完的时候,排序过程即结束);另一种是: 两个指针指向同一个序列,一个指向开头,一个指向结尾 (如快排)。原创 2020-05-18 00:01:02 · 748 阅读 · 0 评论 -
前缀和&差分硬核图文总结——经典4大例题附图讲解
1.一维前缀和:典型模板题:前缀和题目:输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行,每行输出一个询问的结果。数据范围1≤l≤r≤n1≤l≤r≤n,1≤n,m≤1000001≤n,m≤100000,−1000≤数列中元素的值≤1000−1000≤数列中元素的值≤原创 2020-05-04 00:35:29 · 2442 阅读 · 2 评论 -
两大经典实用排序(快排和归并)
题目:785. 快速排序给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤1000001≤n≤100000输入样例:53 1 2 4 5...原创 2020-05-03 08:20:23 · 433 阅读 · 0 评论 -
高精模板(基础加减乘除)
高精四大基本模板(加减乘除)两个大整数相加/*可以把 vector简单理解为动态一维数组push_back作用是在这个一维数组尾部插入一个元素其值为 push_back的参数值假设当前 vector元素序列为 1 5 7,大小为 3那么 push_back(4)后 元素序列为1 5 7 4,大小为 4 *///高精度加法 #include <bits/stdc++.h&g...原创 2020-05-03 08:11:25 · 407 阅读 · 0 评论 -
前缀和(一维)
**前缀和**题目:输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行,每行输出一个询问的结果。数据范围1≤l≤r≤n1≤l≤r≤n,1≤n,m≤100000...原创 2020-05-03 00:31:08 · 642 阅读 · 0 评论 -
二分(整数二分【例题:数的范围】)
数的范围(整数二分)题目给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每...原创 2020-05-02 23:57:07 · 543 阅读 · 3 评论