自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 4.2练习 火柴排队 题解

首先题目要求我们算的是最少多少次移动之后,两个序列的对应位置的差值的平方之和最小,那么我们比较容易能够想到:当a,b两个数组通过相同的升降序规则排列的情况下,就是对应着最小平方和,那么我们继续往下面想,但是发现我们如果把两个数组分别计算排序总共需要移动多少次的话,似乎时间复杂度就过高了,所以我一直在想一种转化的方式,可惜还是没想出来。问题的解释大概如下:有两盒火柴,每盒有n根,每个火柴的高度不同,现在你要做的是尽可能的让两列火柴的距离最小,定义两列火柴的距离为:1~n所有火柴的差的平方和。

2024-04-02 21:05:04 329

原创 3.13练习题解

而很明显这个操作次数也就等于差分数组中,所有正数之和与所有负数的绝对值之和的更大值。然后答案就是通过最少的上面两种操作将差分数组变为全0的数组的操作次数。如果觉得光看很难懂不妨在草稿本上模拟一下样例,就明白了。1.将差分数组中的一个元素减1,另一个加1.2.将差分数组中的只一个元素加一或者减去1.

2024-03-13 14:47:58 346

原创 3.12练习题解

我们可以这样进行考虑,由于数组b是中间数组,我们不妨先对三个数组进行排序,然后我们对b进行枚举,对于每一次枚举,我们在a数组中找到所有小于当前枚举对应的b数组下标元素的个数,然后再找到c数组中所有大于当前b数组下标所对应的元素个数,再把当前符合条件的总个数加到ans上面即可。最后,减去1,是因为我们希望得到的是下标而不是偏移量。在C++中,数组的下标是从0开始的,而指针的偏移量是从1开始的(即,指向第一个元素的指针偏移量为0,指向第二个元素的指针偏移量为1,依此类推)。的结果就是找到的元素在数组中的下标。

2024-03-13 00:15:00 814

原创 3.11练习题解

②:因为我们要找一段区间的平均数,根据平均数的一个基本应用,显而易见,对于一段序列,每个数减去我们所算的平均数,如果大于0 那么他本身就大于平均数,如果小于0 那么它本身就小于平均数 此时我们就能算出哪些数大于0 哪些数小于0 ,之后我们再使用前缀和,就能判断一个区间内的平均值是否大于或小于我们二分的平均数了。③:据②我们还可以继续优化,因为我们不仅需要找F大小区间内,我们还要找>F大小区间内的,我们如果用二次for太费时间了,我们这里可以使用双指针的做法。知道了这道题的算法之后,我们就来分析这道题。

2024-03-12 00:38:04 809

原创 3.8题目练习

先进行分析,我们要求的是最小的t,并且t满足t时刻已经让所有管道都检测到了水,那么我们就可以发现,t其实就相当于是一个分界线,小于t的都不满足条件,大于t的都满足条件,而t时刻是刚刚好满足的,也就是我们要求的条件。这道题可以直接通过数学推导的过程进行解答:首先我们不妨假设答案是v,那么对于一组金属的a,b必有b*v<=a,并且容易推测出冶炼不出b+1个,所以还有(b+1)* v>a;当n为4的时候,我们可以得到的序列为:4 42 41 421,f[4]=4=f[1]+f[2]+1;

2024-03-08 19:57:07 358

原创 3.7练习题解

这道题目的方法就是差分加二分,订单的数量越多,那么剩余的空余教室的数量肯定会减少,因此我们考虑使用二分的方法进行查找,对于每一份订单,我们都有一个区间,在这个区间上加上订单所对应的借教室的数量,但是我们会发现题目当中,n和m的极限数据是10的6次方,如果对于每一个订单我们都将从第l天到第r天进行枚举并加上借教室的数量的话会导致tle,所以我们考虑使用差分的方式进行加速处理,这样处理的时间复杂度为O(n+m)logm。

2024-03-07 21:05:48 393

原创 stl的基本知识学习

1.vector:2.set:3.map:4.栈:5.队列:6. unordered_map与unordered_set:7. 位运算:8.cctype:

2024-03-06 20:20:34 433

原创 2024.3.6补题

对于这个题,我们其实可以将四科进行单独的考虑,同时我们可以看到主人公的大脑可以两个脑子分别解答一道题,对于每一个科目,当题目数量为1的话那么毫无疑问这一科目的时间就是完成该课程复习的时间,而当有多道题目的时候,我们进行思考后会发现,两个大脑由于可以同时运转,同时解答两道题目,那么我们会发现如果要得到最短时间,那么我们其实也就是尽可能在多的时间内两个大脑同时运转,其中一个大脑的运算时间一定是小于等于另一个大脑的,所以这一个题我们可以考虑利用01背包的方式进行解答,接下来请看代码;

2024-03-06 17:57:20 841

原创 两道日常练习题:洛谷P1165日志分析 + 洛谷P1553 数字反转(升级版)

代码较长不过思路不复杂并且非常详细易懂考虑进了所有的情况,希望读者能够耐心看完。输入输出以及数据范围;

2024-01-22 03:50:34 371

原创 洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数

这道题目的难点在于怎样去根据一个不同的k值,通过代码来实现将所有符合题目要求的数字相加并且不重复的功能。这道题目如果实在不能一次性看懂可以用测试的样例来根据代码进行模拟,有助于更好的理解代码。

2024-01-20 00:44:48 411 1

原创 数据结构之单调栈、单调队列

这段代码使用了两个单调队列来记录最大值和最小值的索引,在滑动窗口的过程中寻找满足条件的子序列,并记录其长度。这一道题目需要仔细的理解单调队列在其中的运用,请读者仔细领悟与思考。定义:队列中的元素按照递增或者递减的线性关系排列的队列。上面的代码我附着了详细的讲解。第三题的难度较大:数对统计。

2024-01-10 20:47:43 1775 3

原创 数据结构之堆——学习笔记

这段代码通过维护最大堆和最小堆,根据输入的数字实时调整堆,以便高效地计算中位数。在中位数的计算过程中,通过在两个堆之间调整元素,确保了两个堆的大小差距在一个合理的范围内。这样做的目的是为了避免在求中位数时需要对所有数据进行排序的开销,从而实现更加高效的中位数计算。代码中的堆结构的使用主要是为了在O(log n)的时间复杂度内找到当前最高和最低资金,以提高效率。这道题目的数据范围如果给的很小的话其实可以直接考虑模拟做法,但是实际上这道题目并没有那么的简单,接下来看代码,我在上面给了注释。

2024-01-06 22:12:49 1488

原创 数据结构之哈希——学习笔记

这道题目看似很简单实则还是有一定难度的。令base为11会导致值冲突加剧,另外发生值冲突我们考虑双哈希甚至三哈希等多次哈希操作来解决,也就是设置多个base以及p的值,这样的话只有当多组的base和p计算出来的值都相同的时候我们才会认为两个字符串相同。这样的方法可以理解为开设了多个链表,每个下标都相当于是一条链表,实际上虽然这种方法已经解决了绝大多数的问题但是当遇见特殊的样例,也就是样例映射之后全部都在一个下标的时候,一样是存在问题的。今天看网课学习了哈希的数据结构,写下这一篇博客记录自己的学习过程。

2024-01-05 18:17:09 632 1

原创 数据结构之二叉树

2.深度为h的完全二叉树的节点数范围是多少?根据完全二叉树的定义可以知道它最后一层上面的所有部分都满足满二叉树的特征并且最后一层具有一个分界点,分界点的左边节点全部都是存在的而分界点的右边一个节点都没有。所以我们可以知道,深度为h的完全二叉树最小节点数为2^0+2^1+2^2+...+2^(h-2)=2^(h-1) -1+1。而其最多的节点数和满二叉树是一样的。

2024-01-03 18:18:20 2070 3

原创 洛谷 CSP-J 2021 分糖果+插入排序 个人解答的优化过程以及详解

接下来就是Q次操作了,从1到Q进行枚举,每次的操作类型是op,如果op为2,直接输出对应的ans,因为排序是我们已经进行过的操作,否则如果是1的话,我们就要将对应x的下标中val改为v,然后利用一个中间变量tmp存下修改后的下标为p的结构体,并将从下标为x的结构体开始,挨着交换到n,然后将n令为tmp再从后到前枚举进行排序以便用于下一步的操作,并将排完序之后的大小顺序利用ans数组来进行更新。这个思路确实很难想,我想多数的读者和我一样都是想的第一个思想也就是直接模拟,希望读者仔细体会第二段代码,有所收获。

2023-12-25 20:58:26 470

原创 洛谷 CSP-J2020 优秀的拆分 + 直播获奖

首先读入n,w还有所有的评分,然后接下来我们用for循环来从1枚举到n,对于每一次枚举,cnt数组中,下标值等于对应a数组中下标为i的加一个,也就是成绩为a[i]的人数加一,然后我们引入了一个s,这个s可以看作在每一次枚举过程中能够获奖的人数,我们插入一个从600枚举到0的循环,当寻找到能够获奖的最低分数的时候,就跳出循环,每次循环中s的初始值都是0。如果为1,就需要输出2的i次方。

2023-12-25 17:29:32 550

原创 洛谷 NOIP2018普及组 龙虎斗 + 洛谷 CSJ-2019 公交换乘 代码优化

属于是一点脑子都不动这个方法,就是在输入完之后,我们引入一个ansp2,这个变量是来第一次更新ansp2的时候用到的,然后在每一次枚举之中,通过套两重循环,来不断的通过tmp和当时的ans进行比较,来判断是否需要更新ans还有ansp2,sum1,sum2分别是两个阵营的气势之和,最后输出我们要的ansp2即可。

2023-12-23 18:54:28 373

原创 洛谷 NOIP2016 普及组 回文日期 + 洛谷 NOIP2017 图书管理员

这个方法就是将年份进行了循环,从1000循环到9999年,每次循环先判断出是否是回文年份并且这个回文年份是否在输入的起始日期和截止日期之间,如果在,那么就可以ans++,这是因为我们可以发现日期是一个八位数字,并且由于年份、月份和日子都不可以为0,所以我们其实可以把年份看成特殊进位的数字,进而只需要循环一万次不到就可以得到结果。这道题目本来是不难想思路的。

2023-12-23 00:57:18 478 1

原创 洛谷 NOIP2014普及组 比例简化 + 洛谷 NOIP2015普及组 扫雷游戏

对于这一道题,要求新的A',B'的比值要大于等于A/B并且二者之差尽可能小,同时新的A',B'互质而且不能大于L。我用dx,dy从-1开始,1为止,来枚举每一个数字的周围九个格子,当然了,当周围的某个格子是空白的时候需要特判,所有我加了if作为特判条件,这样就能轻松的完成本题了。其实不难看出这一道题目的样例范围并不大,所以其实我们可以用暴力枚举的方式进行解答,虽然暴力枚举在很多题目并不值得提倡,不过不得不承认它是一种更容易让人理解的方法。

2023-12-22 20:15:29 466

原创 洛谷 NOIP2012 普及组 寻宝

以测试样例为例,就是首先n,m分别代表了楼层数和每一层楼的房间数目,然后样例n,m分别不是2、3嘛,然后接下来输入的每三行就代表了一层楼的每个房间,每一行两个数字,第一个数字为0 1表示该房间是否存在楼梯通往下一层楼,第二个数字就是代表了房间里面指示牌的数字。然后最下面那一行一个数字代表了一开始从最底层的哪一个房间号开始探险。这样就完成了时间复杂度的优化,是能获得满分的代码。

2023-12-22 18:20:21 420

原创 数论学习的总结

而在写代码过程是这个过程的逆向过程,先分解到底,看最后这个a^d%p是否为1或n-1,如果是说明已经分解到底了,也就是通过了此次素性测试。原理是费马小定理:如果p是素数,则a ^ (p-1)%p == 1,加上二次探测定理:如果p是一个素数,则x^2%p==1的解为,则x=1或者x=n-1。* (ak ^ pk)主要是把一个数n的n-1分解成d*2^ r的形式,其中d为奇数,正向过程是a^ n%p如果是1,就继续分解。=>by + ( a - a / b (下取整) * b) * x = gcd(a,b)

2023-12-22 12:18:22 337

原创 一次解答细节较多但思路不难的字符串题目的优化过程

思路其实也并未有多大的改变,改了几个小地方,减少了枚举次数同时用一个if判断出了cnt是否需要加1.

2023-12-21 00:20:42 329

原创 归并排序的学习

具体来说,就是当通过递归将分界点左右两边分别排成各自有序的序列之后,然后通过两个指针,分别从各自序列的第一个元素开始比较,假设这时候按从小到大的顺序进行排列,那么那个指针指向的元素更小,就把他放在数组的前面,并更新指针的位置,当某一个序列的指针指向的最后一个都已经插入到数组中之后,我们将未插入到数组中的元素逐一补到数组后面即可,因为一开始两个序列的排序都已经各自排好,所以可以这样操作。

2023-11-27 21:26:23 348

原创 快排与nth_element函数

需要注意的是快排在最坏的情况之下(相邻的两个数进行交换),它的时间复杂度和冒泡排序是一样的,快速排序是基于二分的思想实行的,大多数情况下快排都比冒泡排序快是因为快排的交换是跳跃式的而不像冒泡是一个个的挨着去对比,快排的每次操作都会将基准数放在对应的位置,使得他左边的数字都小于他,右边的数字都大于他(或者左边都大于他右边都小于他)。首先给出一个序列,假设这时候要求你对他按照从小到大的顺序进行排列,那么有一种排序方法-即快速排序,它包含了分治、二分、递归思想的运用,对序列进行排序并大大降低了时间复杂度,

2023-11-27 13:15:09 370

原创 数据结构之链表——学习笔记(2)(包含循环链表的基本知识与运用)

实际上循环链表里面是没有头,尾的概念的,只是我们需要head和tail来引入节点,当引入完成之后,那么每一个节点都是完全一样的,所以说呢这个时候就没有头和尾这个说法了,因为这个时候链表是一个圈,这个圈上面有一个个节点上面分别含有一个个的元素。1.如何在head的前面插入节点now: 首先我们将now的下一个(next)设置成head,然后将head的上一个(prev)设置成now,最后将head令为now即可。但是我们需要思考一个问题,就是如何在头部和尾部进行插入节点的操作。例题:n个学生的成绩。

2023-11-26 16:53:34 332

原创 数据结构之链表——学习笔记(1)(基本概念与相关的几道习题讲解)

类似于锁链,链表的每一节都可以打开,能够快速做到一些用数组存储数据时比较麻烦的操作,比如在中间插入或删除数据、取一段连续的数据、对一段连续的数据进行翻转等操作。一个节点包含它存储的数据(Date),以及一或两个用来指向上一个/下一个节点的位置的指针。链表有很多的类型,我目前学习的是单向链表,单向链表中的节点只记录后一节点的位置信息。链表是一种类似于锁链的数据结构,锁链的每一节可以看成是链表之中的一个元素。链表上的数据存储单元,一般称为节点(Node),类似于数组中的一个位置。第二题:链表中间的元素。

2023-11-23 13:38:55 787

原创 引用与指针

偶尔我们会遇见那种要取模的问题,通常是遇见那种在计算过程的某一阶段时候数值变得很大时,题目通常会让你取模,不过对于上述代码我们需要明确的几个问题就是首先p的范围是0到p的,否则就达不到题目的要求效果,总而言之只是给读者一个简单的例子便于理解引用。指针具有很多的作用,在有些问题里面它可以让问题变得更方便,就像利用指针指向一个很大的结构体的时候,就可以节省很大的时间还有空间,就好比上面的结构体。这样我们就可以通过(*p).x和(*p).y修改和访问对应的值,另外(*p).x可以使用p->x代替。

2023-11-22 18:53:51 31

原创 比较函数的一些讲解

其中在cmp函数中加上&符号是为了让程序跑的更快,但是需要注意的是,如果加了&符号,当使用函数的时候,函数里面的值改变了的话对应的函数外面的值也会改变,加上const的目的就是让传进去的x,y的值在使用函数的时候值不改变。这样就实现了将a数组的a[1]一直到a[n]进行了排序,需要强调的一点就是sort函数是默认将排序的部分按从小到大的顺序进行排序的。另外在具体赘述比较函之前,我们先看一个简单的问题,如果我已知一个序列,我需要将他按从大到小的顺序进行排序应该怎么做?如果相等,再按照数组下标升序排序。

2023-11-20 21:07:58 99 1

原创 队列的进阶用法-循环队列

对于一个循环队列,首先我们需要确定他的大小,也就i是他队首到队尾一共多少个元素,当我们通过一些操作到了队尾时候,我们再将一开始的队首加在这时候的队尾,也就是当rear在front之前的时候,就是循环队列,同时需要强调的是,用size定义队列长度时候,我们用数组表示循环队列的时候我们要将size开的足够大。对于问题一,当rear的下一位等于front的时候就代表这个循环队列是空的,也就是rear%size+1==front的时候。将新元素x加入队列,并更新队尾rear的位置,确保队列的循环性。

2023-11-20 16:02:50 52 1

原创 队列的四道习题

首先我们存入总人数和要报的数字,并引入一个数组q代表每个人的编号,然后让x来代表每次每个人报的数字是多少,当队列不为空的时候,我们让y来替代此时准备报数的人,然后更新队首和x,x就是y要报的数字,如果x和m相等那么这个人就需要出队,并输出他的编号,并将x重新初始化,否则就继续报下去,于是这个人不可以出队,将他更新在这时候的队伍尾部。这道题是不是非常有趣?精髓就是将一个报了数不出队的人放在了队伍尾部,解决了这个题围成一个圈的题干的问题,而把他看成一条可以不断更新的直线队列。

2023-11-19 14:31:45 61

原创 队列的定义及其基本运用

【代码】队列的定义及其基本运用。

2023-11-18 19:45:09 42 1

原创 洛谷暴力枚举题单的解题记录

首先由于十种配料并且每种配料都只能放一到三克,因此需要考虑当没有满足条件的方案时,输出0的情况,然后利用十个for循环进行暴力枚举,当有一种方案符合要求的时候让计数器加一,并存储在二维向量result之中(稍等会给出这个数据结构的解释),然后输出计数器的结果,当计数器大于0时,先对每种符合要求的方案按字典序排序以便符合题目要求进行输出,最后遍历每一种方案按字典序顺序进行输出。这是一个存储整数向量的动态数组,也就是二维向量。可以看作一个表格,其中每行都是一个向量,每个向量都是整数。是一个包含两个向量的向量。

2023-11-17 18:19:03 68 1

原创 二分进阶运用

上述问题对于每个询问,需要考虑使用两次二分找出两个边界,其中一个边界时大于等于l的边界而另一个则是小于等于r的边界,二者作差加1就是输出的第一个数字,利用前缀和在算出边界之间所有数字的和即可。上述代码是一道前缀和与二分的综合运用,其中我们对于每一个询问,首先确定两个边界,我们每组询问要找的数字即为L,不过记得考虑输出-1时的情况,其实由上述的二分部分我总结到:得到的L刚刚好是其对应的if条件里面部分的最后一个,r则是l后面一个。同时二分也不仅仅只能用在数组问题里面,在没有引入数组有时候也可以进行使用。

2023-11-14 18:00:21 84 2

原创 字符串的几道题目及其解答

【代码】字符串的几道题目及其解答。

2023-11-13 21:46:02 54

原创 洛谷P2671求和

一条狭长的纸带被均匀划分出了$n$个格子,格子编号从$1$到$n$。对于第 $5$ 组至第$ 6 $组数据, $1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000$,且不存在出现次数超过$ 20 $的颜色;第二行有$n$用空格隔开的正整数,第$i$数字$number$表纸带上编号为$i$格子上面写的数字。第三行有$n$用空格隔开的正整数,第$i$数字$color$表纸带上编号为$i$格子染的颜色。对于第 $1$ 组至第 $2$ 组数据, $1 ≤ n ≤ 100, 1 ≤ m ≤ 5$;

2023-11-12 14:13:09 70

原创 洛谷P1056排座椅+洛谷P1158导弹拦截

不同导弹的坐标可能相同。第一行包含 $K$ 个整数 $a_1,a_2,\ldots,a_K$,表示第 $a_1$ 行和 $a_1+1$ 行之间、第 $a_2$ 行和 $a_2+1$ 行之间、…同学们在教室中坐成了 $M$ 行 $N$ 列,坐在第 $i$ 行第 $j$ 列的同学的位置是 $(i,j)$,为了方便同学们进出,在教室中设置了 $K$ 条横向的通道,$L$ 条纵向的通道。两套系统工作半径 $r_1,r_2$ 的平方和,是指 $r_1,r_2$ 分别取平方后再求和,即 $r_1^2+r_2^2$。

2023-11-12 12:22:27 83

原创 前缀和与差分在题目中的应用

这道题的思路就用到了前缀和,我们要找一个和最大的子段,从1到n,我们先依次枚举并求前缀和,然后我们通过下标相减的方式来表示子段,对应一个确定的右边界下标l,如果想让子段最大那么很明显我们需要让左边界及其前面的所有数字之和最小,因为这样二者相减(也就是子段)才会最大,关键的难点在于在枚举的过程中表示出来,也就是代码中最后一个for的ans,还有x的表示。记录一下两道小小的练习。

2023-11-12 00:18:26 33

原创 初学前缀和、差分

对于上述第二个for循环其实就是指1到q次操作中,每一次操作下对应的l,r之间进行了一次记录,也就是说l,r之间不是每个元素都需要加一嘛,我们先通过记录边界,边界加了多少次那么我们引入的s数组就可以计算每个位置总共需要加多少次。这个技术在处理需要频繁查询某个范围内元素和的问题时非常有用,因为通过预先计算并存储前缀和,可以在常数时间内获得任意范围的元素和,而不必每次都重新计算。是一个数组的累积和数组,其中每个元素表示原数组从开头到当前位置的所有元素的总和。

2023-11-11 19:54:50 45 1

原创 计数排序与贪心的初体验

第二个for循环就是计数排序,我自己将注释写进了代码里面,很值得深深的去思考这个排序方法运用到这道题的奥妙,本来n是3万,所以我一开始本来打算用的选择排序很明显不适用了,最极端的情况时间复杂度达到了3e,会超时,想起贪心的思想和这个计数排序一起结合在这道题目,慢慢有了利用贪心方法解答题目的思想。$100\%$ 的数据满足:$1\le n\le3\times10^4$,$80\le w\le200$,$5 \le P_i \le w$。第二行为一个整数 $n$,表示购来的纪念品的总件数 $G$。

2023-11-11 14:35:29 31 1

原创 贪心的初学

第一行包含 $K$ 个整数 $a_1,a_2,\ldots,a_K$,表示第 $a_1$ 行和 $a_1+1$ 行之间、第 $a_2$ 行和 $a_2+1$ 行之间、…、第 $a_K$ 行和第 $a_K+1$ 行之间要开辟通道,其中 $a_i< a_{i+1}$,每两个整数之间用空格隔开(行尾没有空格)。同学们在教室中坐成了 $M$ 行 $N$ 列,坐在第 $i$ 行第 $j$ 列的同学的位置是 $(i,j)$,为了方便同学们进出,在教室中设置了 $K$ 条横向的通道,$L$ 条纵向的通道。

2023-11-10 21:07:04 30 1

空空如也

空空如也

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

TA关注的人

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