自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 夏令营入门组day5

对于当前史莱姆,分成其左右两部分。对于左边,并不关心到底是左边哪只史莱姆把它吃掉的,只要从当前史莱姆向左遍历直到覆盖区间内史莱姆质量和大于当前史莱姆质量,只要这个区间内的史莱姆不是质量全部都相等(只要有一个大于其他所有或小于其他所有),就一定会产生一个大史莱姆可以吃掉当前史莱姆。每次询问,对于每一个点都判断与下一个点是否为临近点会超时,因此预处理,预先判断每一个点的临近点,然后将花费存入前缀和数组,这样在每次询问直接调用前缀和数组即可。判断是否出现不同的史莱姆,设一个p来判断即可。

2024-07-18 20:43:39 155

原创 夏令营入门组day4

(3)其中遍历整棵树的最短距离为(边数 - 1) * 2 + 从根节点到最远的叶子节点的距离,因为走到一个叶子节点就会返回,回到根节点再去下一个叶子节点,因此所有边都会走两遍,但可以选一个最远的叶子节点最后一个走,到达后就留在那里不回根节点了。(1)B要先去和A回合,因为B只能将红染成蓝,不能直接将白染成蓝,所以B必须走A走过的路才有效。(2)答案分为两部分,去和A回合的最短距离 + 以回合点为根节点,遍历整棵树的距离。(1)dfs1 找回合点,vector变量pash保存路径,计算A与B之间的距离。

2024-07-15 18:35:26 199

原创 夏令营入门组day3

(1)与day1的pie题相似,仅用前缀和枚举两个端点会超时,采用同样的思路:固定左端点,所有区间的左端点都是左顶点。枚举右端点,找到两个区间和相等的右端点,两区间右端点相减得到的区间的和即为0。map的作用不同:pie中map用来统计每种余数出现的个数,本题中map用来记录每种 区间和最靠右的顶点。该题中可以省略掉set,每次循环输入数值,计算前缀和,同时更新map中的对应值。

2024-07-15 18:16:07 149

原创 夏令营入门组day2

若下一个数为负且当前和为负时不取绝对值,若下一个数为正且当前和为负时取绝对值。反例:-5 -3 2 -1 -7 在加完前两个时遇到2不应取绝对值,应该在最后一步时再取加绝对值才能达到最大值。(2)正确思路:由于并不知道该在何时对和取绝对值,所以用maxn和minn看最大能到多大和最小能到多小,在最后一次再取绝对值。正确思路:对回合数二分答案,回合数大于正确答案Boss一定死,小于正确答案一定杀不死,符合单调性。一堆草周围牛数等于2,祥判断是否满足上述特例,若满足,只要上方的草加过一次,下方的草就不加。

2024-07-15 18:15:21 341

原创 夏令营入门组day1

因为是解决区间上的问题,很容易想到用前缀和来解决。前缀和是o ( n ) 的时间复杂度,但后续枚举两个端点要 o ( n^2 ),对于2e10的数据,超时。对这个得到的区间模k取余,当余数为零是这个区间就符合条件。对于余数不为零的区间,只需要找到另一个余数相同的区间,两区间相减得到的区间就是k倍。固定左端点,去枚举右端点来把时间复杂度降到o ( n )。对于两个不同的区间,因为左端点都是原点,两个右端点相减得到的中间一段即为某个区间。这样就把问题转化成找相同余数余数。所有区间的左端点都是最左边的零点。

2024-07-11 20:27:57 166

原创 java期末突击

当不同类之间有大量重复的成员变量和方法时,设置一个父类,包含所有类共同的部分,所有类作为子类继承父类,已经拥有共同部分,只需再添加自己特有的部分即可。(1)相当于C++中的函数,但由于java是面向对象的语言,因此方法是在成员里面的,通过调用成员来调用方法,故称之为成员方法。例:类为Animal,方法为eat,但不确定是什么动物,若是猫则吃鱼,若是狗则吃骨头,无法确定,因此需要声明抽象方法。当父类中的某些方法需要声明,但又不确定该如何实现时,可以将其声明为抽象方法,那么这个类也被称为抽象类。

2024-05-31 13:24:59 342

原创 牛客小白月赛86

根据条件列式:sw[ r ] - sw[ l ] >= W,固定左端点找右端点,sw[ r ] >= W + sw[ l ],因为sw[ l ] 是固定值,因此可用lower_bound找到 r。对于每一个剪下的图形,dfs遍历出该图形的最大和最小的 x,y值,并记录下格数,x差值 * y差值得到一个正方形面积,将该面积与剪下图形格数相比较判断是否为长方形。找到 r 后,可口值为 sd[ r ] - sd[ l ],因为sd[ l ]是固定值,只需找到从 r 到 n 的最大 sd[ i ]

2024-04-20 11:20:20 202

原创 牛客小白月赛89

12。

2024-04-17 20:20:18 251

原创 二叉树的遍历——洛谷P1364

通过一个结构体,包括每一个节点的父、子节点,在读入一个节点的数据时,标记其子节点的父节点为自己。

2024-04-03 21:05:53 210

原创 初识二叉树——洛谷P4715

从根节点到倒数第二层,共有( 2的n次方-1 )个节点,因此从2的n次方下标开始存入所有叶节点。某一父节点下标为 i ,则其左孩子下标为 2 * i,右孩子下表为 2 * i + 1。开辟一个内存为2的n次方大小的数组,每一个各自对应树的一个节点。从下往上( 树 ),从后往前( 数组 ),依次填入数据。

2024-04-03 20:56:58 182

原创 最小公约数 最大公倍数 同余原理

( a - b )% m = ( a % m - b % m + m ) % m // 最后加上m,防止出现负数。( a * b * c )% m = a % m + b % m + c % m // 每乘一步 取一次模。( a + b )% m = a % m + b % m // 每加一步 取一次模。每一次调用gcd传进去的两个值,若b为零则输出a,否则再次调用gcd,传入b,a%b。

2024-03-29 21:21:30 220 1

原创 双指针用法

为了是船数量最少,应使得每艘船都空间最大化利用,因此应将最轻与最重搭配。同向,两个指针向同一个方向移动,例如都从数组小下标移向大下标。有时双指针技巧会包含单调性(贪心)方面的考虑。相向,两个指针分别从左右两端向中间移动。本题实质是贪心,借助双指针算法来实现。

2024-03-27 17:19:59 273

原创 动态规划(一):从递归转变为dp ——力扣 983 最低票价

无论是递归还是dp,核心都在于找到尝试策略分类,实质是在模拟。dp只是递归的另一种写法,两者并无本质区别。

2024-03-20 16:00:27 775 1

原创 动态规划前置准备:递归

与例1不同的是,这里不需要用到for循环去选数,因为每一个对象都会去判断它是否选择,最终并不确定会选择多少个。而例1确定要三个数,至于这三个数选哪些,则需要去for循环,在每一个位置枚举放进来的数。本题与例题1不同,例2的本质是给定的字符串s1中每一个字符都有选或不选两种情况,其实是动态规划的体现,用到的则是列出所有尝试策略。给定一个字符串s,长度为n,求字符串s的全部子序列。注:不能出现重复子序列,例如 ‘aab’ ,只能返回一个 ‘ab’。本题共有两种策略:选或不选,因此双路dfs,即两种策略。

2024-03-17 14:39:38 318 1

原创 字符串哈希——洛谷P3370

本文主要介绍三种实现哈希表的方法:进制哈希,set哈希,map哈希。

2024-03-11 23:22:14 377

原创 STL中的set——洛谷P5250

(3)使用set的前提是唯一键值对,保证了其内部没有重复元素,而优先队列内部同一元素可以有多个,这是两者第二个区别。(1)插入一个元素,自动排序,保证其内部元素有序(升序)。优先队列也可以做到这一点。(2)支持任意增删一个元素,而优先队列做不到这一点,这是两者其中一个区别。#使用lower_bound和upper_bound要注意特判首尾。

2024-03-09 16:41:10 774 1

原创 二分查找与二分答案

给定特定条件,要求找出最符合该条件的答案。存在某个点,当变量小于该值时条件不成立,大于该值时条件成立(反过来也可以),符合单调性,即一侧成立一侧不成立。此时通常以最左端为 l ,最右端为 r ,通过二分不断去逼近这个点。已知一组数据,并给定待查值,要求找出该值对应下标或最接近该值对应下标。代码比较繁琐,哪里要取等,哪里要加一减一,务必记清楚。主要看一看二分答案中的判断条件即其函数如何写。

2024-03-08 17:22:09 509 1

原创 二分+前缀和——洛谷P1314

在读入数据时要找到最大和最小的矿石重量,而min和max函数要求内部参数一致,不能一个int一个long long,实际上w数组没必要long long ,只是定义数组时和a,b数组定义在了一起,而这两个数组要long long,如果你要分开来定义想换成int也无伤大雅,这里只是想提一点min,max函数内部参数可能出现的问题。然后开始前缀和,a数组是前缀和数组,对象是上面的n数组,因为要的是满足条件的个数,所以是加 1。b数组也是前缀和数组,对象是矿石价值数组,所以是加上矿石价值。

2024-03-08 15:23:23 1025 1

原创 前缀和(一维/二维)

tot { ( x1 , y1 ) , ( x2 , y2 ) } = s ( x2 , y2 ) - s ( x2 , y1-1 ) - s ( x1-1, y2 ) + s ( x1 , y1 ) //加上多减去一次的重合部分。tot ( x , y ) = a [ i ] [ j ] + s ( x2 , y1-1 ) + s ( x1-1, y2 ) - s ( x1 , y1 ) //减去多加上一次的重合部分。

2024-03-07 15:30:01 210

原创 再探记忆化(深度解析)——洛谷P1434

理解dfs,知道下一步将走向哪里,最好的方法就是通过调试看程序是如何运行每一行代码,下一步将走向哪里,只有这样才能真正学通dfs。

2024-03-04 15:34:33 668 1

原创 并查集详解

并查=合并+查找,集=集合。顾名思义并查集的优点在于将一堆数据按照特定条件分成n个集合,并且能够快速实现查找某一元素属于哪一个集合、将任意两个集合合并的操作。

2024-03-02 21:59:30 463

原创 洛谷P2058——去重思想

1)最开始的思路是这样的:开一个book数组,每次一个人入队,book[该人国籍]=1,但这会遇到一个问题,当一个人超出时间而要出队时,并不能book[该人国籍]=0,因为在队列里可能还有和他相同国籍的人,而这些人还在时限内不需要出队列。仔细思考船进入海港后统计船上的人,实际上串的批次对这个问题没有任何影响,真正起作用的是人,因此可以开一个结构体,记录每个人到达的时间和他的国籍,每次入队只需要把这个人传进去就可以了,因此就简化掉了船这个因素。入队:若ct[该人国籍]==0,答案数加1。

2024-02-25 17:02:09 190 1

原创 洛谷P3613——vector 可变长数组

cin>>n>>q;此时是只改变第一维大小。

2024-02-25 15:19:02 261 1

原创 洛谷P1102——STL中两个二分查找函数

假定我们有一个有序的数组a,并将数x作为二分查找的目标,那么:lower_bound(a,a+n,x)-a //下标从0开始lower_bound(a+1,a+n+1,x)-a //下标从1开始它们就能取得最小的数组a的下标i,满足ai​⩾x。即找到第一个大于等于x的数组下标。upper_bound(a,a+n,x)-a //下标从0开始upper_bound(a+1,a+n+1,x)-a //下标从1开始它们就能取得最小的数组a的下标i,满足ai​>x。即找到第一个大于x的数组下标。

2024-02-24 15:58:51 267

原创 洛谷P1048——0/1背包(滚动数组)

观察二维表dp[][]可发现,每一行都是由上一行推出,且只与上一行有关,与更前面的行无关,因此用新的一行覆盖原来的即可。动态规划的题经常会给出很大的N和V,经过滚动数组的优化,空间复杂度从O(NV)减少为O(V),但滚动数组也有缺点,它覆盖了中间转移状态,只留下了最后的状态,导致无法输出背包方案。第二层循环必须逆序,即从后往前覆盖。目的是为了避免重复。少掉的一层是i行,留下的是j列。普通二维可能会导致TEl。

2024-02-06 18:10:06 233 1

原创 洛谷P1216——基础dp的两种方式

自上而下需要用到递归,因为第一层无法通过第二层得到答案,因为第二层还需要由第三层决定,而第三层又要由第四层决定,实际上程序是一直到最底层,再逐步退出来逐层向上给出答案,这样就一定超时。先搜左边一路,a[1]—>a[2]—>a[4],a[5]—>(图中漏了a[7],整体向后挪一位)a[8],a[9],a[10]—>a[12],a[13],a[14],a[15](1) if (x==r) 若到达最底层,返回的就是该层中对应坐标的值,不需要再递归了。而搜右路时,a[5],a[10]已搜过,可直接用。

2024-02-06 16:58:35 310 1

原创 洛谷P1090——优先队列

优先级最高的先出队。它是队列和排序的完美结合,不仅可以存储数据,还可以将这些数据按照设定的规则进行排序。每次的push和pop操作,优先队列都会动态调整,把优先级最高的元素放在前面。

2024-02-02 22:21:35 219

原创 洛谷P1106:删数问题

寻找最高峰,即单调递增子列中的最后一项。(纸上自己演算便可发现)此思路避免了既要删除较大的数,又要使其尽量靠前的繁琐条件。erase(i,n):从i开始(包含i),往后n项,删除。erase(i):从i开始(包含i),后面全部删除。

2024-02-02 22:05:01 200

原创 记忆化搜索(洛谷P1028 P1464)

记录每一次搜索对象的返回值,以后递归搜索中若再次出现该对象,则可直接引用之前存储的值,不必再次对该对象进行递归求值。2.i以x/2作为初始值进入循环,s+=f(i)立即再次调用递归函数,以此类推,直到调用到1,在 逐步退出来。1.for循环中s+=f(i),每一个f(i)的值都是i这个数能产生的子集数。在该递归结束前(及return的上一步),使用数组记录下要return的变量。3.a[x]在从1开始逐步退出来之前,记录该次的答案。(1)洛谷P1028:数的计算。

2024-01-28 16:38:03 250

原创 DFS(洛谷P1036 P1157 P1706)

第二种仅为递推,没有回溯,因为本身就不是全排列不需要输出所有解,同时也不需要用book去标记某数是否使用过,因为对于每一组解来说,每个位置上的数永远在前面一个位置上的数的后面,不存在像回溯一样某个数会有取出再放的问题,因此book标记是否使用可省略。2.i=startx。该startx指一个特定的值,通常为上一级dfs起始值加1。此时是全排列,包含乱序(即非字典序输出),共有n!DFS常用于解决所有解,即全排列的问题。注意此方法dfs函数里需要定义两个变量!1.洛谷1706(纯模版题)第一种为递推+回溯。

2024-01-14 20:02:42 364

原创 洛谷P1059:明明的随机数

本题是计数排序的变向应用,而对于计数排序来说,是基于分类而非基于比较后互换的排序是属于分治的思想。由于计数排序的本质是以每一个数个体为标杆,因此可以解决重复数字的问题。由于N的范围为【1,1000】,开数组没问题,可以考虑用。

2023-12-28 18:03:33 392 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除