- 博客(138)
- 收藏
- 关注
原创 【环型链表】快慢指针解决链表问题
作者:Time-Limit链接:https://leetcode.cn/problems/linked-list-cycle/solution/yi-wen-gao-ding-chang-jian-de-lian-biao-wen-ti-h-2/来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。无法高效获取长度,无法根据偏移快速访问元素,是链表的两个劣势。
2023-04-08 00:30:04
172
原创 【LC128】最长连续序列,哈希
要求O(n)的时间复杂度是本题难点,如果排序或使用二叉平衡树、红黑树(C++ map,set)来解决,复杂度是O(nlogn),只能采用哈希。对于x1,x2,x3…,xn,最长的连续序列,应该是从x1开始,x1满足一个x2-xn不满足的条件,就是x1在set中没有前驱元素x1-1。C++中的哈希是unordered_set和unordered_map,本题用unordered_set。这样就只会遍历n次,单次遍历复杂度为1,就有了On的算法。
2023-04-07 12:01:08
363
原创 【LC94】二叉树中序遍历,递归化迭代
递归很简单,考虑化成迭代的写法,一般递归化成迭代需要考虑参数列表和函数运行到哪一句(栈中的PC指针)的问题,所以一般不好写。本题递归的参数只有一个节点,每次递归也会从同一个起点开始执行语句,所以可以用栈手动实现递归。这一段栈的代码其实不好理解,需要画图仔细看看才能看懂。
2023-04-06 18:53:28
280
原创 【最短路】SPFA模板:最短路和判断负环
题目LP3371 LP3385思路对于判断负环,当从起点到当前结点经过结点数大于n-1,跳出即可。代码单源最短路#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>...
2018-09-12 01:06:03
424
1
原创 【最短路】洛谷1119 灾后重建(floyd的DP本质分析)
题目洛谷P1119思路暴力算法即每次询问情况做一次dijktra。 AC算法,本题考虑floyd的DP本质。 首先谈谈Floyed算法:Floyd算法的本质是动态规划,其转移方程 为:f[k][i][j] = min( f[k-1][i][j], f([k-1][i] [k])+f[k-1][k][j] )。 f[k][i][j]表示路径除开起点i与终点j,只经过前k...
2018-09-11 23:48:15
229
原创 【最短路】洛谷P1144 最短路计数(注意过程取模问题)
题目LP1144思路正常最短路,检测到可以松弛覆盖最短路个数,检测到路径相等最短路个数加上即可。 本题注意过程取模问题,程序过程中就要及时取模,不要到了输出的时候再,不然鬼知道会不会爆。代码#include <cstdio>#include <cstdlib>#include <cstring>#include <algor...
2018-09-06 18:30:34
255
原创 【最短路】UVa10048 噪音 (floyd求min/max问题)
题目从a点到b点, 找到一条路径,使得这条路径上的所有噪音中最大的值是所有路径中最小的, 这个噪音值便是要求的。思路首先询问次数较多,考虑多源。这个路径结点最大值最小问题,其实类似于最短路,floyd改一下即可。代码#include <cstdio>#include <cstdlib>#include <cstring>#i...
2018-09-05 00:38:16
149
原创 【多源最短路】 UVa247 电话圈 (求传递闭包)
题目如果两个人互相打电话(直接或间接),则说他们在同一个电话圈里。例如,a打给b,b打给c,c打给d,d打给a,则这四个人在同一个电话圈里;如果e打给f但f不打给e,则不能推出e和f在同一个电话圈里。输入n(n≤25)个人的m次电话,找出所有的电话圈。人名只包含字母,不超过25个字符,且不重复。思路传统的最短路中,d[i][j]表示i到j的最短路。本题只要将d[i][j]改成i到j...
2018-09-04 23:58:52
187
原创 【图论】单源最短路的三种算法
题目例题可以用洛谷P3371和P4779思路1.dijstra 完美做出,但条件是不能有负权边,堆优化以后复杂度是O(mlogn)。 2.bellman-ford 主要用于有负权边的情况,理论复杂度是O(nm),但队列优化以后往往远小于这个复杂度。 3.floyd 多源最短路算法,这里也拿过来一块学了,复杂度是O(n3)O(n3)O(n^3),所以不应该用多元最短路算法flo...
2018-09-04 00:00:17
1032
原创 codevs1081 树状数组的区间修改和单点查询
题目给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? codevs1081思路代码#include <cstdio>#include <cstdlib>#include <cmath>#include <algorithm>#include <cstring>...
2018-08-09 19:01:49
176
原创 codevs1080 树状数组模板题
题目codevs1080思路一、树状数组 1.单点修改,区间查询: &lt; O(logn)。 2.代码量小于线段树,但功能不如线段树多。 3.查询只支持1~i的和,所以求区间和要用前缀和的形式。 (具体树状数组的代码实现是固定的,看代码)代码#include &lt;cstdio&gt;#include &lt;cstdlib&gt;#include &lt;...
2018-08-09 08:59:26
202
原创 [并查集] codevs1073 家族(并查集的一般写法和两种优化)
题目codevs1073思路即给一个无向图,判断两个结点是否连通。 并查集 路径优化的内容上面讲了,对于另一个优化:按秩合并: 在合并两个子树的时候,分别设两个子树的结点个数为tot[i],tot[j]。若tot[i]>tot[j],那么理想的方法是把j子树接到i子树上,原因是,这样做只会有tot[j]个结点的深度加一,而另外一种接法需要有tot[i]个结点的深度加一。...
2018-08-08 19:58:07
223
原创 [二叉堆] 洛谷P1090 合并果子
题目LP1090思路本题需要画一下图 可以观察到: 每个果子的代价:重量*在树中深度 考虑如果构造一个深度越深的结点权值越小,就能达到最小权值。那么本题的做法就变成了每次选最小的两堆果子合并。这个可以用二叉堆来做。代码#include <cstdio>#include <cstdlib>#include <cmath>#...
2018-08-08 19:02:28
243
原创 [堆] 洛谷P3378 二叉堆模板
题目如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数二叉堆支持两种操作1.往一个集合加一个数。 2.从集合中删去一个优先值最大的元素。 规则每个结点比儿子优先级大。 插入规则:先插入到最后一个结点,然后不停与父节点交换,直到到了根节点或者比父...
2018-08-08 11:17:44
347
原创 [二分] 洛谷P1083 借教室 (二分答案+差分)
题目LP1083思路二分答案首先可以看出,最后答案ans存在明显的单调性,这个单调性是1或0的单调性,有点特殊,大概是这样的: 所以就可以二分答案,二分出来的答案应该满足这样的规律:对于ans个订单,教室够借。对于ans+1个订单,教室不够借。 这里给出二分的模板:(来自WYF) 所有的二分都应该是下面两种的一个,不能出现类似于这样的二分:mid = (l+r...
2018-08-07 18:36:33
543
原创 [二分] WYF快速幂魔改版
题目出处qbxt夏北京二期,提高组精英版,WYF出题。题目给一个n个数的序列a,需要进行m次询问,每次询问需要计算a[a[a[x…]]]的值,其中括号有t对。 输入第一行有n,m,t三个数,第二行有n个数表示序列a,第三行有m个数分别表示每次询问。 输出m个数,分别表示每次询问所得值。 数据范围:n,m&lt;=100000,t&lt;=10^9。思路对于a[x],设b[...
2018-08-06 21:51:21
329
原创 [二分] 洛谷P1226 快速幂
题目输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。做法快速幂讲解代码代码1:没有位运算#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#def...
2018-08-06 13:08:31
215
原创 [表达式树] SDUT2484 算术表达式的转换(二叉树遍历)
题目输入一算术表达式,输出该表达式转换所得到的前缀式 中缀式 后缀式。Sample Input a*b+(c-d/e)*f#Sample Output+*ab*-c/defa*b+c-d/e*fab*cde/-f*+思路本题用表达式树,先建一个表达式树,然后这个树的前序,中序,后序遍历分别对应前缀,中缀,后缀表达式。 代码代码有建立表达式树的方法,以及...
2018-08-02 10:16:56
651
原创 [背包DP] 洛谷P2066 机器分配 (最小字典序的最优方案)
题目总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。 INPUT 第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。 接下来是一个N*M的矩阵,表明了第 I个公司分配 J台机...
2018-07-23 14:10:02
884
1
原创 [背包DP] 洛谷P1284 三角形牧场(已知推未知的状压DP)
题目LP1284思路首先本题是一个判断DP,那么就考虑指标函数如下定义: d == 0:不存在, d == 1:可以构成边, d == 2:可以构成三角形。 那么就是状态的定义问题,刚开始我想到的是d(i,j,k),分别表示三角形三边。但这样发现1600^3会MLE,所以不可取。 由于根据边的总和s可以根据两边求出第三边,所以这里三边都表示是没有必要的,这里跟技巧枚举那里有点相似...
2018-07-21 15:27:15
326
原创 [背包DP] 洛谷相关题目整理与练习(74题-)
以背包为标签,搜出了这么多题,按难度排序,一道一道做: TODO 题目 难度 备忘录 AC 采药 普及- 01背包模板 AC 开心的金明 普及- 01背包模板 AC 小A点菜 普及- 背包方案数问题 AC NASA的食物计划 普及- 简单的二维费用背包 AC 疯狂的采药 普及-...
2018-07-21 09:33:11
2428
原创 [背包DP] Vijos1037 搭建双塔 (二维费用存在性背包)
题目2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座...
2018-07-20 14:41:35
190
原创 [背包DP] Vijos1412 多人背包(背包第k优解)(STL使用问题)
题目VP1412 LP1858思路思路见背包九讲。 刚开始考虑直接用stl的queue实现,vijos的第一个题解也是这么实现的,但是仔细一看好像O(NVK)O(NVK)O(NVK)好像不太行,然后vijosAC,洛谷一半的点TLE了。 后面手动用数组实现了一下队列,洛谷也AC了。 这里的问题就是STL的使用,对于复杂度不是很紧的题目,STL可以随便用。但是对于本题洛谷的数...
2018-07-20 14:14:35
318
原创 [背包DP] 洛谷P1757 分组背包
题目LP1757思路背包九讲代码#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <utility...
2018-07-19 21:13:35
436
原创 [背包DP] Vijos1334 NASA的食物计划(二维费用背包)
题目航天飞机的体积有限,当然如果载过重的物品,燃料会浪费很多钱,每件食品都有各自的体积、质量以及所含卡路里,在告诉你体积和质量的最大值的情况下,请输出能达到的食品方案所含卡路里的最大值,当然每个食品只能使用一次。思路背包九讲代码#include <cstdio>#include <cstdlib>#include <cstring>...
2018-07-19 20:56:36
163
原创 [背包DP] CODEVS 3269 混合背包
题目CODEVS 3269思路参考背包九讲,抽象化以后的过程组合起来,简单+简单+简单 != 难。 代码#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#defi...
2018-07-19 20:24:54
212
原创 [多重背包] POJ1276 Cash Machine (二进制优化)
题目有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。思路多重背包模板题。 1.朴素的多重背包,每个状态转移时枚举用的某种货币的个数,复杂度:O(C∗∑n[i])O(C∗∑n[i])O(C*\sum n[i]),TLE。 2.二进制优化,背包九讲里面有。 此处应该注意的是,1…n的任意整数用尽量少的几个整数表示...
2018-07-19 15:41:28
408
原创 [动态规划] 《背包九讲》阅读笔记
1.01背包题目与问题解决有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 过程 ZeroOnePack,表示处理一件01背包中的物品,两个参数cost、weight分别表明这件物品的费用和价值。 不同问题的初始化有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。...
2018-07-19 15:33:47
602
原创 [多阶段DP] 洛谷P1164 小A点菜(方法数背包)
题目LP1164思路这道题困了我很久,一直不知道背包的方法数该如何统计,还以为是在背包的算法上进行修改,结果只是将状态的指标函数改成方法数而已了。 1.状态定义:d(i,j),遍历到第i道菜,花光j元的方法数。 2.状态转移:当j==w的时候,可以选择只买这道菜,或者买前面的菜凑足w的钱。当j>w的时候,可以选择买这道菜并且用前面的菜凑j-w的钱,或者买前面的...
2018-07-19 10:01:54
234
原创 [区间DP] 洛谷P1026 统计单词个数(预处理)
题目LP1026思路本题很明显的是区间DP,但是多了个划分次数的量k,当k还小于kk(题目给的k)的时候就还得继续划分。没关系,本题常数小,状态上还可以加个k。 1.状态定义:d(i,j,k),区间[i,j]内已经划分了次数k时,最大的单词数。 2.状态转移: (1).当k = kk时,直接计算区间[i,j]的单词数即可。 d[i][j][k]=c[i][j]d[i][j]...
2018-07-16 21:04:21
190
原创 [二维DP] 洛谷P1156 垃圾陷阱 (状态的定义和转移条件问题)
题目LP1156思路首先注意此处的输入数据处理问题,我们以下的推理都是建立在垃圾按扔入时间t排序好的,所以一定要对输入数据进行处理。 本题显然是个多阶段决策类的问题,那么难点就在于状态的定义。本题的题解的状态定义是多样化的,有用一维就做出来的大佬,普遍是两维数组。但两维的(i,j),大多都是i为垃圾序号,j为所处高度,d为最大生存时间。我用的是少见的一种,i为垃圾序号,j为生...
2018-07-16 19:33:48
236
原创 [线性DP] 洛谷1052 过河(线性离散化)(输入数据处理问题)
题目LP1052思路可以看到本题的l很大,不能作为数组索引量。一般情况下考虑两种做法,一种是转变思考状态的方法,把l转移到数组元素值上,另一种离散化。 本题用后者。 首先列出状态转移方程,i指的是线段上的坐标。 d(i)=min{d(i−k)|k∈[s,t]}d(i)=min{d(i−k)|k∈[s,t]}d(i) = min\left\{d(i-k)|k\in [s,t]\ri...
2018-07-16 16:44:40
405
原创 [区间DP] 洛谷P1063 能量项链(环的处理)
题目LP1063思路做这道题做了一早上。。只能说,做紫书例题做多了,都是LRJ已经想好了所有的细节给出了完美无缺的思路,只是让我去实现一下代码,甚至在代码实现的时候还回去看下std程序。这就养成了上来大大咧咧做,不考虑细节,不仔细演算的坏习惯。。同时还会给一种——这种板子题,瞎JB乱搞也能做出来,不停地改一个参数跑一次测评,就等AC那一下,为什么改都不知道。。看吧,区间DP入门题,...
2018-07-16 10:57:48
262
1
原创 [多维DP] 洛谷P1541 乌龟棋(高端技巧的使用问题)
题目LP1541思路可以看到,本题需要用一个40进制的4位数来表示状态。自然想到了基金管理,自然就想到了两种方法:四十进制数和状态池。 显然本题用40进制数,数组会太大(40^4=2560000),所有考虑用状态池。写的也很顺利,然后TLE了一半的点。 而正解就是个简单的多维状态,用多维数组来表示。 启示:可以说,在noip阶段,紫书上的题很难很难。绝大多数的题用到的技巧,都...
2018-07-15 16:49:37
226
原创 [动态规划] UVa12105 越大越好(用DP辅助其它算法)
题目思路思路1: d(i,j)表示i根火柴,除以m得余数j的最大可以拼出来的数。 问题:拼数问题需要高精度算法,计算量大。 思路2: d(i,j)表示i根火柴,除以m得余数j的可以拼出来的最大位数。 在计算位数时,顺便记录每一位的最大值。根据贪心,位数越大数字越大越好。 抖机灵题,看看就好代码// UVa12105 Bigger is Better...
2018-07-15 11:06:51
367
原创 [区间DP] UVa1336 修缮长城 (未来费用的计算)
题目思路首先将修缮点按坐标从小到大排序,则已修复的点一定是一个连续的区间。这样就可以用d(i,j,k)表示已经修复完(i,j),机器人现在在k(k=0左边缘,k=1右边缘)时已经发生的总费用。 那么就有一个问题,费用根据时间计算,而状态里没有时间,那下一个修缮点的费用该如何计算? 此处类比颜色长度。由于所有修缮点肯定都要被修,那么我们先把所有的立刻修缮费用加起来作为初状态,每次...
2018-07-15 09:26:09
254
原创 [经典DP] UVa10934 装满水的气球
题目思路常规思路应该是d(i,j),用i个气球有j层楼,最少用多少次测出。 但本题的样例是这样的:Sample Input2 10010 7865994 78659960 184467440737095516163 92233720368547758070 0Sample Output1421More than 63 trials needed.61...
2018-07-14 14:39:54
544
原创 [线性DP] UVa1627 团队分组(二分图与背包)
题目思路前置知识,hdu4751二分图。 首先本题跟hdu4751有点像,a和b不认识,b和c不认识,那么必然就有a和c在一个组。如果这时a和c再不认识,就是无解的情况。 所以上来首先给本题来个二分图判定,并分出连通块,此时的所有连通块都应当是二分图。 根据某一个连通块上的交叉染色,分出这个连通块的team0和team1。 那么现在就有两种选择,第一种是team0成为我...
2018-07-14 13:39:49
894
1
原创 [图论模型] hdu4751 二分图及二分图判断
二分图 二分图,图论中的一种特殊模型。设G=(V,E)G=(V,E)G=(V,E)是一个无向图,如果顶点VVV可以分割成两个互不相交的子集(U,V)(U,V)(U,V),并且图中的每条边(i,j)(i,j)(i,j)所关联的两个顶点分别属于这两个不同的顶点集(i in U,j in V)(i in U,j in ...
2018-07-14 10:05:09
381
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人