![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题日记
王禄DUT
这个作者很懒,什么都没留下…
展开
-
哈夫曼编码模板
【代码】哈夫曼编码模板。原创 2024-08-09 21:37:59 · 52 阅读 · 0 评论 -
注意事项-
1.用scanf printf别用cout cin2.intlong longbool。原创 2024-08-09 18:33:57 · 201 阅读 · 0 评论 -
树状数组POJ-2299
树状数组是为了解决一些单点修改 区间查询的问题 如果加上差分数组可以用来解决区间修改和单点查询问题 由于编程简单可以用来替代一些线段树的情况 但不是绝对的。这一类操作使用树状数组就显得及其复杂,这时候我们建议使用扩展性更强的线段树来解决,在此就不进行树状数组的讲解了.只能相邻的交换 本题转换为消除所有的逆序对需要多少次 一次只能消除一对 求逆序对总数。本题的关键是逆序对:i>j a[i]<a[j]为一个逆序对。利用树状数组实现同时离散化。也就是poj-2299。转载 2024-08-09 18:29:58 · 2 阅读 · 0 评论 -
HDU-1166
【代码】HDU-1166。原创 2024-08-09 15:42:23 · 158 阅读 · 0 评论 -
poj-2528
然后就是套用线段树模板 稍微更改一下pushup pushdown update和query就可以啦。一道对我来说真正意义的难题 我卡卡我卡卡大佬不要蕨 小白选手。distance代表迭代器之间的距离 求下标非常好用。从0学了离散化和线段树 终于写出来了 非常有成就感。find()返回迭代器对象。原创 2024-08-08 23:17:49 · 142 阅读 · 0 评论 -
线段树模板-适合小白版
【代码】线段树模板-适合小白版。原创 2024-08-08 22:24:17 · 87 阅读 · 0 评论 -
Poj-2182
2.线段树降低时间复杂度。原创 2024-08-07 20:30:34 · 96 阅读 · 0 评论 -
HDU-4453
相比于普通二叉搜索树的不同在于splay()操作 可以将任意节点转移到根 (时间局部性,空间局部性) 可以进行一些动态插入删除 然后动态对区间进行反转 加数等操作 也是借鉴了一些线段树的原理。后来查阅资料得知: 延迟思想就是推迟对区间的更新,将操作的标记存储在节点上,只有在需要访问或修改节点时才真正执行这些操作。splay树 :为什么要使用 相比于AVL更快 没有那麽多复杂的平衡 相比于线段树 可以动态插入和删除。由于学splay数树的时候还没有学线段树 所以对延迟思想有一些困惑。原创 2024-08-07 18:54:56 · 110 阅读 · 0 评论 -
HDU-1622
1.insert插入的时候 如果结点为空要先new再递归。3.对字符串api熟悉使用。2.flag代表记录次数。原创 2024-08-07 17:23:38 · 158 阅读 · 0 评论 -
POJ-1442
模板题:treap模板可直接用 改变一下主函数输入就可以 具体看代码注释。原创 2024-08-06 22:58:15 · 147 阅读 · 0 评论 -
HDU-4585
首先是treap树:之前学过二叉搜索树,而treap官方理解是堆和树的结合 高优先级在上 低优先级在下 ,而按照我的理解就是给树新增一个rank元素(随机) 使得搜索树每次在插入的时候 会改变位置 防止链状。记住size是相对于整个树而言的 而不是当前的root所以。在回溯的时候update size。当root空 return-1。插入左节点 回溯判断是否右旋。插入右节点 回溯判断是否左旋。当找不到就return-1;统计右边所有元素+1就行。先判断是否是 是直接返回。这个可用于所有二叉树。原创 2024-08-06 21:06:18 · 93 阅读 · 0 评论 -
POJ-2418
【代码】POJ-2418。原创 2024-08-06 17:40:37 · 64 阅读 · 0 评论 -
HDU-3791
二叉搜索树的特殊性质导致只比较前序就可以判断是否相等。原创 2024-08-06 17:17:38 · 154 阅读 · 0 评论 -
HDU-3999
2.想要保证属的形状相同就必须先插根节点 因为先查根节点 然后插别的就和根节点无关了。3.为了保证字典序最小 插完根节点 应该先插左子树 再插右子树。1.二叉搜索树: 左<根<右。综上 先序遍历解决问题。原创 2024-08-06 16:21:34 · 186 阅读 · 0 评论 -
HDU-1710
本题的关键是理解先序和中序建树 还有中序和后序建树 网上的很多教程都没有讲清楚。* &root:注意&否则传递的只是地址值 改变地址 没有改变本身的地址。但后序不能正向进行 因为最后建设根节点 先建设左右节点这是不可能的。所以要倒序 从根建立 左右根 变为 根右左 同时t--即可成功构建。t:根据先序 根左右来建树 每次新增的结点都是先序遍历顺序的结点。l,r:当前利用先序的根节点搜索左右子树的范围来判断结束条件。这里我们要注意的是 先序和中序建树是按照先序的顺序正向建树。关键点在于理解函数的四个参数。原创 2024-08-04 23:42:11 · 92 阅读 · 0 评论 -
Poj-1182
1.使用三倍大小的并查集来储存食物链 将每个动物分为A B C三种情况 但我感觉这种思路比较抽象不如第二种可以让人学到知识(其实是自己没理解。大神写的也是十分完善了,我就不过多赘述,仅仅在这里写一下本题的大致思路,加深一下自己的认识。父亲假设为A +1变成B 父亲吃自己 +2 变成C 自己吃父亲 A-B-C-A这种关系。(b-a+3)mod3 b代表被插入树的权值之和 a代表插入树的权值之和。如果想得到一个节点对另一个节点的关系 就需要遍历当前的树 相加状态。解释的比较抽象还是看大佬的思路吧。转载 2024-08-04 20:18:01 · 8 阅读 · 0 评论 -
Poj-1611
【代码】Poj-1611。原创 2024-08-04 16:58:03 · 92 阅读 · 0 评论 -
POJ-2524
【代码】POJ-2524。原创 2024-08-04 16:37:56 · 65 阅读 · 0 评论 -
HDU-1213
/关键点在于有多少个i=friend[i]就说明就多少个原始集合。原创 2024-08-04 14:54:42 · 82 阅读 · 0 评论 -
HDU-1667
下面是大神的写法 似乎跟我的思路差不多 并且如果是互逆操作剪枝 这个是没有想到的。首先放上我的思路:似乎有点找到IDA*的感觉了。3.不规则结构的存储和移动。转载 2024-08-03 23:42:06 · 6 阅读 · 1 评论 -
HDU-1560
使用IDA*:迭代dfs+剪枝 首先读取每一个字符串 然后选择最大长度作为初始深度 每次迭代+1 设置三个数组: dna序列数组 当前匹配数组 最短dna序列数组 剪枝: 剩余匹配数组的最大值小于深度-当前dna序列的长度 每次dfs都更新当前匹配数组。本题我根据大佬的代码做了一些改动 使用pos[]全局变量作为记录当前追踪过程 每次遍历完后回溯。其次就是dfs遍历的原理 逻辑一定要严谨 不能有疏漏 再接再厉吧。做了几道IDA*的题发现关键还是求最小代价作为剪枝是关键。原创 2024-08-03 22:30:59 · 163 阅读 · 0 评论 -
poj-3134
这题是例题,虽然是照着抄下来了,但还是有点不懂。原创 2024-08-03 20:48:08 · 180 阅读 · 0 评论 -
HDU-5113
因为只需要一种情况所以当找到的时候 直接return true;一直返回到主函数 当前chessboard保留的即是正确答案。dfs按照从左到右 从上到下顺序 所以只有两个方向。这道题是借鉴大佬代码 自己复现的。注意checked数组不要越界。不知道为什么少个+1就wa了。//遍历每一种颜色剩余数量。然后就是套dfs模板+回溯。复现出来还是很有成就感的。原创 2024-08-03 16:53:05 · 179 阅读 · 0 评论 -
HDU-1175
这是我的第一道dfs题 相比于bfs 我对利用递归的dfs理解的没有那么透彻。当我dfs时候需要if(dfs())return true;这里要注意进行回溯因为当我们递归返回的时候代表另一种思路需要取消标记。下面代码是我自己写出来 根据gpt修改意见AC出来的。3.bool类型的dfs函数:一种return的思想。4.全局变量y1和math中的变量重名需要更改名字。初始值要设为-1 因为第一次四个方向都不算转折。2.我忘记了visited数组 这是关键。1.本题关键是我利用转折次数。原创 2024-08-03 14:30:56 · 160 阅读 · 0 评论 -
HDU-1401
使用双向广搜:降低时间复杂度 一个搜索4步即可 因为5 3 可以转换为4 4 不缺情况。使用sort排序:否则visited会有大量重复状态。今天两道题都没AC出来 不过还是学到很多东西的。四个点四个方向注意判断是否可以跳。使用八维数组记录坐标。原创 2024-08-02 21:48:33 · 189 阅读 · 0 评论 -
Poj-1077
bfs遍历每一种情况类似于迷宫 利用康托哈希函数去除已找到状态 降低时间复杂度。构建node数据结构储存每一种图的状态 利用route来记录路径。一道经典的八码图问题 使用bfs+康托哈希函数。memset(目标,原始,长度sizeof)memcmp(目标,原始,长度sizeof)memcpy(目标,原始,长度sizeof)原创 2024-08-02 16:00:56 · 199 阅读 · 0 评论 -
HDU-4460
若为INF说明当前第一次被找到 distance=distance[v]+1;挑选max_distance 若INF 说明二者不是朋友 return -1。否则 result=max(max_distance,result);然后vector<vector<int>> adj构建邻接表。然后for(int u:adj[v])//遍历临界点。QAQ,这就是本道题的大致思路 图的邻接表+dfs。//记得初始化开始元素的distance为0;adj.push_back() 插入操作。使用bfs能获得最短距离。原创 2024-07-21 23:03:17 · 153 阅读 · 0 评论 -
递归打印全排列ANN ANM CNM
找1:kk=kk&(kk-1)会将最低位1变0 右侧0变1 与原来的kk相与 去掉最低位1 循环次数为1的个数。当我们调用递归第一层时候 有四种情况 第一位各不相同 第二层调用时候 第一位和第二位互不相同。这时候我们可能想到如何得到n个数挑m个数的全排列 很简单减少递归层数即可,(1原创 2024-07-21 16:03:04 · 241 阅读 · 0 评论 -
HDU-1240
5.flag数组由于为全局数组,每次需要重新清空 memset(flag,0,sizeof(flag))1.三维数组 dir数组 node结构体 planet数组的定义 用什么样的数据结构来储存。4.什么时候move++:记录开始队列的长度 遍历完这个长度的元素 move++代表一层。3.能够知道bfs原理是按层去找 所以当你第一次找到你所要的层的时候 一定是最少的层。算是对我来说小有难度的一道题 逻辑不难 关键在于细节的处理。原创 2024-07-21 20:05:55 · 153 阅读 · 1 评论 -
HDU-1312
一个很基础的bfs遍历操作,算是一个板子。原创 2024-07-21 18:51:07 · 128 阅读 · 0 评论 -
HDU-1716
实现这两个功能本题就解决了,刷题第二天圆满结束。2. 千位数字不同换行。原创 2024-07-21 01:33:11 · 140 阅读 · 0 评论 -
HDU-1027
如果没学过next_permutation这道题可能很棘手,但只要学过这个按照字典序迭代的stl函数,就可以轻松解决,我在这里没考虑m>n 的情况 可以将next_permutation放到判断中去。然后我擦合约资料发现next_permuation也可用于普通数组,使用指针即可。原创 2024-07-21 01:02:29 · 185 阅读 · 0 评论 -
HDU-2648
商店对应着价格 根据一天价格浮动得出排名 乍一看可能用struct自定义类型+优先队列实现,但元素是动态变化的,堆不能实现自动排序 ,只能在插入的时候排序,所以老老实实使用map记录,最后遍历得到当天rank。这道题最开始一直wrong,后来发现测试用例不止一个 ,加上while(cin>>n)就好了,原创 2024-07-21 00:20:03 · 174 阅读 · 0 评论 -
HDU-2094
我还使用了一个错误的办法 只使用winner集合 每次插入 并删除loser 这样的错误在于 后面有新的winner我还是会插入 当时这个winner之前已经被打败 所以很大概率都是YES ,但是我有一个心的办法 比题目麻烦 就是 winner-loser集合 观察winner是否为isempty用到的新知识是: .find() 如果没找到会返回.end()迭代器,大家可以自己尝试这个鸡肋的做法;如果二者相等说明所有人都失败过 否则一定有一个人没失败过为最终的winner。原创 2024-07-20 23:27:41 · 169 阅读 · 0 评论 -
HDU-1276
it可以获得迭代器的值 it->first it->second 可以获取map键值对。迭代器定义 List<int>::iterator it;erase(it)会自动返回下一个迭代器对象。auto 自动确定类型。原创 2024-07-20 22:53:03 · 86 阅读 · 0 评论 -
HDU-1873
使用优先队列 关键在于自定义优先级 其他没有难度。原创 2024-07-20 21:58:50 · 154 阅读 · 0 评论 -
HDU-1702
很简单的利用STL的stack和queue即可解决。原创 2024-07-20 17:49:39 · 154 阅读 · 0 评论 -
HDU-1237(简单计算器)
刷题第一天:这道题就让我很抓马,和正常的波兰表达式不一样 他这个测试用例没有括号,我的大概思路就是改变了一下,设置一个计算函数和优先级函数,使用流读取每一行表达式,数字压栈,符号的话则进行比较,小于就进入计算函数,最后处理剩余的op即可,只要理解中缀后缀表达式应该可以写出来。原创 2024-07-20 01:28:00 · 210 阅读 · 0 评论 -
HDU-4841
记录刷题第一天:这道题是很经典的约瑟夫问题,大概意思是n个人排成一圈,每次选择固定位距的人去掉 ,首先需要pushback初始化位置,这里我利用了vector数组erase属性的自动缩进属性 ,在每次使得在指针不变的情况下,每次指针都是从正确位置开始计算。原创 2024-07-20 01:17:45 · 211 阅读 · 0 评论