- 博客(93)
- 收藏
- 关注
原创 连通块中点的数量
要特别注意所有处理size的地方,都要“归根结底”要特别注意所有处理size的地方,都要“归根结底”是不是大家都太强不屑于做板子题啊。是不是大家都太强不屑于做板子题啊。维护连通块size的并查集。size只有祖节点的有意义。维护连通块size的并查集。size只有祖节点的有意义。为什么这个题题解这么少啊。为什么这个题题解这么少啊。
2022-09-19 11:23:48
237
原创 数的三次方根
/ eps 表示精度,取决于题目对精度的要求, 一般比所求精度高 2。浮点数二分的本质也是边界, 唯一区别是浮点数没有整除, 区间长度可以严格的缩小一半。注意 r - l的取值与所求答案要求精度, 一般比要求高的 2。题目给出了查找范围, 直接在范围中进行查找。当区间长度足够小时, 便可以认为是一个数。根据视频整理, 结合视频理解效果更佳。在 100循环中进行寻找。
2022-09-18 14:38:28
412
原创 数组元素的目标和
不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。i++)//输入优化。
2022-09-18 14:35:26
457
原创 堆算法的实现
举例: 用ph数组来表示ph[idx] = k(idx到下标), 那么结点值为h[ph[idx]], 儿子为ph[idx] * 2和ph[idx] * 2 + 1, 这样值和儿子结点不就可以通过idx联系在一起了吗?第三步需要找到原来第idx的元素所在的位置,由于交换完后ph[idx]的值变了,变为堆尾的下标了,所以必须要在之前保存ph[idx]的值。swap(ph[hp[a]], ph[hp[b]]):狱警:先申请查住户册,看这两个地方住的谁,再在花名册下写下来,这两个人位置换了。
2022-09-18 14:34:14
158
原创 匈利亚算法实现
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替 路称为增广路(agumenting path)。//st[]数组我称为临时预定数组,st[j]=a表示一轮模拟匹配中,女孩j被男孩a预定了。//如果女孩j没有男朋友,或者她原来的男朋友能够预定其它喜欢的女孩。完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。//match[j]=a,表示女孩j的现有配对男友是a。
2022-09-18 14:33:03
147
原创 kruskal算法的实现
这是又枚举到了6-8这一条边,此时总集合边的数量为5,因为6和8属于同一个集合,加入6-8这条边之后,集合中会构成环,所以将6-8这条边舍弃。为x,那么里面x个节点应该是被串联起来的,有x-1条边,所以只有当a,b所属的集合不同时,才能将a-b这条。如果加入a-b这条边,会导致集合中有环的生成,而树中不允许有环生成,所以一个连通块中的点的数量假设。//因为加入的是a-b的这一条边,将a,b所在的两个集合连接之后,全部集合中的边数加1。这是当前的全部集合,此时总集合边的数量为4。判断边是否应该加入到集合中。
2022-09-18 14:32:21
131
原创 prim算法的实现
1->2 的距离为 100,小于 dist[2],dist[2] 更新为 100,pre[2] 更新为1。遍历所有与 i 相连但没有加入到连通部分的点 j,如果 j 距离连通部分的距离大于 i j 之间的距离,即 dist[j] > w[i][j](w[i][j] 为 i j 节点之间的距离),则更新 dist[j] 为 w[i][j]。选dist[4],更新dist[3],dist[5],pre[3],pre[5]。
2022-09-18 14:31:25
748
原创 floyd算法的实现
再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。初始化dist, 松弛dist[x.b] = min(dist[x.b], backup[x.a]+x.w);接下来m行,每行包含三个整数x,y,z,表示点x和点y之间存在一条有向边,边长为z。接下来k行,每行包含两个整数x,y,表示询问点x到点y的最短距离。
2022-09-18 14:29:52
204
原创 spfa算法的实现
但是SPFA算法不一样,它相当于采用了BFS,因此遍历到的结点都是与源点连通的,因此如果你要求的n和源点不连通,它不会得到更新,还是保持的0x3f3f3f3f。Bellman_ford算法会遍历所有的边,但是有很多的边遍历了其实没有什么意义,我们只用遍历那些到源点距离变小的点所连接的边即可,只有当一个点的前驱结点更新了,该节点才会得到更新;2] Dijkstra算法里使用的是优先队列保存的是当前未确定最小距离的点,目的是快速的取出当前到源点距离最小的点;//到源点的距离,下标号。//各点到源点的距离。
2022-09-18 14:28:44
142
原创 排队打水算法实现
由于tata * x + tbtb * (x + c) = tata * x + tbtb * x + tbtb * c > tata * x + tbtb * x + tata * c = tbtb * x + tata * (x + c),即交换之后比原来的值更小.由于选取的任意性可得假设成立.如果一个区间的左端点比最小组的右端点要小,ranges[i].l
2022-09-18 14:06:36
243
原创 区间分组的解法
看了一下,貌似是求最大”区间厚度的问题。大家可以把这个问题想象成活动安排问题有若干个活动,第i个活动开始时间和结束时间是[SiSi,fifi],同一个教室安排的活动之间不能交叠,求要安排所有活动,少需要几个教室?有时间冲突的活动不能安排在同一间教室,与该问题的限制条件相同,即最小需要的教室个数即为该题答案。我们可以把所有开始时间和结束时间排序,遇到开始时间就把需要的教室加1,遇到结束时间就把需要的教室减1,在一系列需要的教室个数变化的过程中,峰值就是多同时进行的活动数,也是我们至少需要的教室数。
2022-09-16 23:31:28
347
1
原创 食物链顶端的算法
本题的关系有三层 -> a -> b -> c -> ,但不同的是本题的关系是有向的,也就是说a和b如果是敌对关系,那么b和a就不是敌对关系。还是设 d[x] 表示 x 与 fa[x] 的关系,0 代表是同类,1 代表是x吃fa[x], 根据关系图自然2就代表x被fa[x]吃。y || get(x)==get(y) || get(x)==get(y+n)) //x就是y,或者他们是同类,再或者是y的同类中有x。合并的时候同样fa[x] = y,x⃗ =b⃗ +ab→−a⃗ x→=b→+ab→−a→。
2022-09-16 18:43:27
133
原创 没什么。。。。
高精度除法要求求出商和余数,那我们的思路就是:把上一次的余数乘10,再加上当前位上的数,就是被除数,后面往C(答案)里压入这个数字除以bb,就可以得到商在这个位置上的数字。vector div(vector &A,int b,int &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数。//用来记录所有可以到达的点的mex值。
2022-09-16 18:40:36
201
原创 判断子序列算法
整个过程中j指针不断扫描b数组并且向后移动,相当于不断给i指针所指向的a数组创建匹配的机会,只有匹配成功时i指针才会向后移动一位,当i == n时,说明全部匹配成功。子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。2.整个过程中,j指针不断后移,而i指针只有当匹配成功时才后移一位,若最后若i == n,则说明匹配成功。//b从j开始遍历 直到a[i] =b[j]了,让i+=1。
2022-09-16 18:40:01
333
原创 最长连续不重复的序列
核心思路:遍历数组a中的每一个元素a[i], 对于每一个i,找到j使得双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列,长度为i - j + 1, 将这一长度与r的较大者更新给r。
2022-09-16 18:37:43
285
原创 区间和算法的实现
此处的做法是是对原来的数轴下标进行排序,再去重,为什么要去重呢,因为本题提前考虑了前缀和的思想,其实很简单,就是我们需要求出的区间内的和的两端断点不一定有元素,提前加如需要求前缀和的两个端点,有利于我们进行二分搜索,其实二分搜索里面我们一般假定有解的,如果没解的话需要特判,所以提前加入了这些元素,从而导致可能出现重复元素。此处的解决办法就是开辟额外的数组存放原来的数组下标,或者说下标标志,本文是原来上的数轴上的非连续点的横坐标。离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。
2022-09-16 18:36:30
177
原创 模拟哈希的实现
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2l1,r1,l2,r2,请你判断[l1,r1l1,r1]和[l2,r2l2,r2]这两个区间所包含的字符串子串是否完全相同。前缀和公式 h[i+1]=h[i]×P+s[i]h[i+1]=h[i]×P+s[i] i∈[0,n−1]i∈[0,n−1] h为前缀和数组,s为字符串数组。区间和公式 h[l,r]=h[r]−h[l−1]×Pr−l+1h[l,r]=h[r]−h[l−1]×Pr−l+1。
2022-09-16 18:35:45
178
原创 模拟堆的实现
举例: 用ph数组来表示ph[idx] = k(idx到下标), 那么结点值为h[ph[idx]], 儿子为ph[idx] * 2和ph[idx] * 2 + 1, 这样值和儿子结点不就可以通过idx联系在一起了吗?第三步需要找到原来第idx的元素所在的位置,由于交换完后ph[idx]的值变了,变为堆尾的下标了,所以必须要在之前保存ph[idx]的值。//第idx个插入的元素移到了堆尾,此时ph[idx]指向堆尾。重点:题目中第k个插入,这里的k相当于链表中的idx,是节点的唯一标识。
2022-09-16 18:34:36
251
原创 迷宫问题的解法
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。输出格式。
2022-09-16 18:33:01
758
原创 无标题。。。
mex():mex():设集合S是一个非负整数集合,定义mex(S)mex(S)为求出不属于S的最小非负整数的运算,即:mes(S)=min[x],其中xmes(S)=min[x],其中x属于自然数,且xx不属于SS(用人话说就是不存在SS集合中的数中,最小的那个数)=0 时,因为肯定存在一个SG(xi)SG(xi)^x
2022-09-15 23:06:36
91
原创 博弈论算法的实现2
mex():mex():设集合S是一个非负整数集合,定义mex(S)mex(S)为求出不属于S的最小非负整数的运算,即:mes(S)=min[x],其中xmes(S)=min[x],其中x属于自然数,且xx不属于SS(用人话说就是不存在SS集合中的数中,最小的那个数)=0 时,因为肯定存在一个SG(xi)SG(xi)^x
2022-09-15 23:04:47
734
原创 能被整除的数
例如:1 2 3 4 5 和 1 3 2 5 4这两个排列对应于同一个子集 {1,2,3,4,51,2,3,4,5}。,xi−1可以这个序列可以成功搜索,由于 xi>xi−1xi>xi−1,因此xixi也可以被搜到,所以序列 x1,x2,…,xi−1,xix1,x2,…则 a/bmodp=a∗b−1modp=((amodp)∗(b−1modp))modpa/bmodp=a∗b−1modp=((amodp)∗(b−1modp))modp。因此可以借助逆元转化为乘法,再算,设b的逆元为b−1b−1。
2022-09-15 23:03:28
122
原创 能被整除的数
例如:1 2 3 4 5 和 1 3 2 5 4这两个排列对应于同一个子集 {1,2,3,4,51,2,3,4,5}。,xi−1可以这个序列可以成功搜索,由于 xi>xi−1xi>xi−1,因此xixi也可以被搜到,所以序列 x1,x2,…,xi−1,xix1,x2,…则 a/bmodp=a∗b−1modp=((amodp)∗(b−1modp))modpa/bmodp=a∗b−1modp=((amodp)∗(b−1modp))modp。因此可以借助逆元转化为乘法,再算,设b的逆元为b−1b−1。
2022-09-15 23:02:47
288
原创 快速幂算法的实现
∵二进制可以表示所有数,且用单一用二进制表示时,b单一表示最大可表示为二进制形式的2logb二进制可以表示所有数,且用单一用二进制表示时,b单一表示最大可表示为二进制形式的2logb。快速幂:快速求abab % p的问题,时间复杂度:O(logb)O(logb),若对于n组数据,那么时间复杂度为O(n∗logb)O(n∗logb)b&1就是判断b的二进制表示中第0位上的数是否为1,若为1,b&1=true,反之b&1=false 还不理解?,a2logb.这b个数a20,a21,a22,…
2022-09-15 23:00:59
237
原创 数组元素的目标和
对于任意A[i]+B[j]>X, A,B单调递增,则显然,A[i+1]+B[j]>A[i]+B[j]>X。因此,指针j应该向j-1方向搜索,反之亦然。因此对于任意的指针i,对应的指针j搜索的区域在A[i]+B[j]>X与A[i]+B[j]
2022-09-15 22:58:19
310
原创 欧拉函数算法的实现
所以 φ(pass)φ(psas) = passpsas - psas−1=pass∗(1−1ps)psas−1=psas∗(1−1ps)首先, 欧拉函数是一个积性函数,当m,nm,n互质时,φ(mn)=φ(m)∗φ(n)φ(mn)=φ(m)∗φ(n)对于任意一项 φ(pass)=pass−p(as−1)sφ(psas)=psas−ps(as−1)对于正整数nn,欧拉函数是小于或等于nn的正整数中与nn互质的数的数目,记作φ(n)φ(n).∗φ(paxx)φ(n)=φ(p1a1)∗…i
2022-09-15 22:31:33
200
原创 合并果子。
假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。使用小根堆维护所有果子,每次弹出堆顶的两堆果子,并将其合并,合并之后将两堆重量之和再次插入小根堆中。在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。
2022-09-15 22:29:37
209
原创 没什么了。
根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作。根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作。共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。
2022-09-15 22:08:14
98
原创 推公式算法的实现
wi+si>siwi+si≥w(i+1)+s(i+1)wi+si≥max(si,w(i+1)+s(i+1))由wi+si>wi+1+si+1−>wi+si>si+1−>wi+si=max(s(i+1),wi+si)max(s(i+1),wi+si)≥max(si,w(i+1)+s(i+1))max(交换前)≥max(交换后)所有风险的最大值起码不会变大即只要wi+si不是严格递增,则我们可以把他们变成递增的并且所有风险的最大值不会变大。比较wi−si+1wi−si+1, wi+1−siwi+1−si即可。
2022-09-15 22:07:35
113
原创 滑动窗口解法
思路:最小值和最大值分开来做,两个for循环完全类似,都做以下四步:解决队首已经出窗口的问题;解决队尾与当前元素a[i]不满足单调性的问题;将当前元素下标加入队尾;如果满足条件则输出结果;需要注意的细节:上面四个步骤中一定要先3后4,因为有可能输出的正是新加入的那个元素;队列中存的是原数组的下标,取值时要再套一层,a[q[]];算最大值前注意将hh和tt重置;此题用cout会超时,只能用printf;hh从0开始,数组下标也要从0开始。
2022-09-14 22:53:18
83
原创 排序不等式算法
假设有这样一个最优解序列cntcnt,排好序的序列中有一个数 cntxcntx,它的下一个数比它小,如果两数交换,(n−i−1)(n−i−1) ×× cnticnti - (n−i)(n−i) ×× cntxcntx的下一个数,差一定是严格>0>0的,这就和它是最优解矛盾了,所以最优解序列一定是单调上升的。1、由i的任意性,打水的时间总和为ti1ti1 * (n - 1) + ti2ti2 * (n - 2) + …优先队列版:480 ms。手写堆:212 ms。朴素版:133 ms。
2022-09-14 22:51:28
270
原创 记忆化搜索算法的实现
if(xx >= 1 && xx = 1 && yy h[xx][yy]){ //判断这点是否能走。//Y总说的小技巧,等于把f[x][y]简化成了v,如果v发生变化,f[x][y]也会随之变化。v=max(v,dp(xx,yy)+1)v=max(v,dp(xx,yy)+1) 不要忘了 +1+1。在给定矩阵中,一条可行的滑行轨迹为 24−17−2−124−17−2−1。i ++){ //四个方向。
2022-09-14 22:49:45
110
原创 状态压缩算法的实现
答案是f[m][0], 意思是 前m-1列全部摆好,且从第m-1列到m列状态是0(意即从第m-1列到第m列没有伸出来的)的所有方案,即整个棋盘全部摆好的方案。假设此时对应的状态是k(第i-2列到第i-1列伸出来的二进制数,比如00100),k也是一个二进制数,1表示哪几行小方块是横着伸出来的,0表示哪几行不是横着伸出来的。既然从第i-1列到第i列横着摆的,和第i-2列到第i-1列横着摆的都确定了,那么第i-1列 空着的格子就确定了,这些空着的格子将来用作竖着放。摆放方块的时候,先放横着的,再放竖着的。
2022-09-14 22:45:20
189
原创 树形DP算法的实现
dp[0][i]=∑u=sonsmax(dp[1][u],dp[0][u])dp[0][i]=∑u=sonsmax(dp[1][u],dp[0][u])当前节点不选,那么子节点随意。dp[1][i]=∑u=sonsdp[0][u]+happy[i]dp[1][i]=∑u=sonsdp[0][u]+happy[i]当前节点选,子节点不能选。
2022-09-14 22:44:01
177
原创 线性DP算法的实现
如果f[i][j]= Math.max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j])其中的f[i - 1][j - 1]如果为Integer.MIN_VALUE,并且a[i][j] = 负数时候,会溢出!也就是对于f[2][1]的时候,f[1]f[0]并没有设置这个值,默认为0,题中的数字有负数,则会出现错误的最大值。//f[i][j]表示从(1,1)走到(i,j)的所有路径中,总和最大的那一条路径的总和。
2022-09-14 10:09:07
180
原创 欧拉函数算法的实现
×pk−1pkϕ(n)=n×p1−1p1×p2−1p2×…所以 φ(pass)φ(psas) = passpsas - psas−1=pass∗(1−1ps)psas−1=psas∗(1−1ps)×pk−1pkϕ(n)=n×p1−1p1×p2−1p2×…算法的瓶颈主要在分解质因数上,分解质因数的时间复杂度为O(a√)O(a),但由于有n组数据,所以时间复杂度为O(a√∗n)O(a∗n)首先, 欧拉函数是一个积性函数,当m,nm,n互质时,φ(mn)=φ(m)∗φ(n)φ(mn)=φ(m)∗φ(n)
2022-09-14 10:03:51
1170
原创 容斥原理算法的实现
S1={2,4,6,8,10},S2={3,6,9},S1⋂S2={6},故S1⋃S2={2,3,4,6,8,9,10}S1={2,4,6,8,10},S2={3,6,9},S1⋂S2={6},故S1⋃S2={2,3,4,6,8,9,10}每个集合实际上并不需要知道具体元素是什么,只要知道这个集合的大小,大小为|Si|=n/pi|Si|=n/pi, 比如题目中|S1|=10/2=5,|S2|=10/3=3|S1|=10/2=5,|S2|=10/3=3。将题目所给出的m个数可以看成是m位的二进制数,例如。
2022-09-14 10:01:57
335
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人