自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 连通块中点的数量

要特别注意所有处理size的地方,都要“归根结底”要特别注意所有处理size的地方,都要“归根结底”是不是大家都太强不屑于做板子题啊。是不是大家都太强不屑于做板子题啊。维护连通块size的并查集。size只有祖节点的有意义。维护连通块size的并查集。size只有祖节点的有意义。为什么这个题题解这么少啊。为什么这个题题解这么少啊。

2022-09-19 11:23:48 206 1

原创 数的三次方根

/ eps 表示精度,取决于题目对精度的要求, 一般比所求精度高 2。浮点数二分的本质也是边界, 唯一区别是浮点数没有整除, 区间长度可以严格的缩小一半。注意 r - l的取值与所求答案要求精度, 一般比要求高的 2。题目给出了查找范围, 直接在范围中进行查找。当区间长度足够小时, 便可以认为是一个数。根据视频整理, 结合视频理解效果更佳。在 100循环中进行寻找。

2022-09-18 14:38:28 376

原创 区间合并算法

/ed代表区间结尾,st代表区间开头。if(ed

2022-09-18 14:37:22 250

原创 数组元素的目标和

不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。不作死那还是我嘛,虽然推荐大家用scanf,但此题解中我用的是cin,而且是从一读的。i++)//输入优化。

2022-09-18 14:35:26 429

原创 堆算法的实现

举例: 用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 141

原创 匈利亚算法实现

增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替 路称为增广路(agumenting path)。//st[]数组我称为临时预定数组,st[j]=a表示一轮模拟匹配中,女孩j被男孩a预定了。//如果女孩j没有男朋友,或者她原来的男朋友能够预定其它喜欢的女孩。完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。//match[j]=a,表示女孩j的现有配对男友是a。

2022-09-18 14:33:03 124

原创 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 112

原创 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 704

原创 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 164

原创 spfa算法的实现

但是SPFA算法不一样,它相当于采用了BFS,因此遍历到的结点都是与源点连通的,因此如果你要求的n和源点不连通,它不会得到更新,还是保持的0x3f3f3f3f。Bellman_ford算法会遍历所有的边,但是有很多的边遍历了其实没有什么意义,我们只用遍历那些到源点距离变小的点所连接的边即可,只有当一个点的前驱结点更新了,该节点才会得到更新;2] Dijkstra算法里使用的是优先队列保存的是当前未确定最小距离的点,目的是快速的取出当前到源点距离最小的点;//到源点的距离,下标号。//各点到源点的距离。

2022-09-18 14:28:44 121

原创 排队打水算法实现

由于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 210

原创 区间分组的解法

看了一下,貌似是求最大”区间厚度的问题。大家可以把这个问题想象成活动安排问题有若干个活动,第i个活动开始时间和结束时间是[SiSi,fifi],同一个教室安排的活动之间不能交叠,求要安排所有活动,少需要几个教室?有时间冲突的活动不能安排在同一间教室,与该问题的限制条件相同,即最小需要的教室个数即为该题答案。我们可以把所有开始时间和结束时间排序,遇到开始时间就把需要的教室加1,遇到结束时间就把需要的教室减1,在一系列需要的教室个数变化的过程中,峰值就是多同时进行的活动数,也是我们至少需要的教室数。

2022-09-16 23:31:28 290 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 110

原创 数的范围的算法

所以完全可以当a[mid]

2022-09-16 18:42:12 362

原创 没什么。。。。

高精度除法要求求出商和余数,那我们的思路就是:把上一次的余数乘10,再加上当前位上的数,就是被除数,后面往C(答案)里压入这个数字除以bb,就可以得到商在这个位置上的数字。vector div(vector &A,int b,int &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数。//用来记录所有可以到达的点的mex值。

2022-09-16 18:40:36 181

原创 判断子序列算法

整个过程中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 288

原创 最长连续不重复的序列

核心思路:遍历数组a中的每一个元素a[i], 对于每一个i,找到j使得双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列,长度为i - j + 1, 将这一长度与r的较大者更新给r。

2022-09-16 18:37:43 243

原创 区间和算法的实现

此处的做法是是对原来的数轴下标进行排序,再去重,为什么要去重呢,因为本题提前考虑了前缀和的思想,其实很简单,就是我们需要求出的区间内的和的两端断点不一定有元素,提前加如需要求前缀和的两个端点,有利于我们进行二分搜索,其实二分搜索里面我们一般假定有解的,如果没解的话需要特判,所以提前加入了这些元素,从而导致可能出现重复元素。此处的解决办法就是开辟额外的数组存放原来的数组下标,或者说下标标志,本文是原来上的数轴上的非连续点的横坐标。离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。

2022-09-16 18:36:30 152

原创 模拟哈希的实现

给定一个长度为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 142

原创 模拟堆的实现

举例: 用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 230

原创 迷宫问题的解法

给定一个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 683

原创 无标题。。。

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 73

原创 博弈论算法的实现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 696

原创 能被整除的数

例如: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 101

原创 能被整除的数

例如: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 260

原创 快速幂算法的实现

∵二进制可以表示所有数,且用单一用二进制表示时,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 210

原创 数组元素的目标和

对于任意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 297

原创 欧拉函数算法的实现

所以 φ(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 183

原创 合并果子。

假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。使用小根堆维护所有果子,每次弹出堆顶的两堆果子,并将其合并,合并之后将两堆重量之和再次插入小根堆中。在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。

2022-09-15 22:29:37 175

原创 没什么了。

根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作。根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作。共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。

2022-09-15 22:08:14 83

原创 推公式算法的实现

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 94

原创 滑动窗口解法

思路:最小值和最大值分开来做,两个for循环完全类似,都做以下四步:解决队首已经出窗口的问题;解决队尾与当前元素a[i]不满足单调性的问题;将当前元素下标加入队尾;如果满足条件则输出结果;需要注意的细节:上面四个步骤中一定要先3后4,因为有可能输出的正是新加入的那个元素;队列中存的是原数组的下标,取值时要再套一层,a[q[]];算最大值前注意将hh和tt重置;此题用cout会超时,只能用printf;hh从0开始,数组下标也要从0开始。

2022-09-14 22:53:18 68

原创 排序不等式算法

假设有这样一个最优解序列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 242

原创 记忆化搜索算法的实现

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 94

原创 状态压缩算法的实现

答案是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 175

原创 树形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 151

原创 线性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 168

原创 博弈论算法的实现

不妨设还剩下a′a′个,因为不能不拿,所以0≤a′

2022-09-14 10:05:27 189

原创 欧拉函数算法的实现

×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 1070

原创 容斥原理算法的实现

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 297

空空如也

空空如也

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

TA关注的人

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