数据结构
文章平均质量分 62
数据结构相关知识点和icpc题目
惆怅客123
算法研究痴迷者,ai爱好者
展开
-
UVa1668/LA6039 Let’s Go Green
本题表面是图论题,实际考的是数据结构——并查集。先分析本题的一个简单版本:如果树上只有一个点的度大于1,其余点的度都是1,最少的路径数是多少呢?计所有边权和为s,最大边权为x,思考一下可知最小路径数为max(⌈s/2⌉,x)。考虑每个点i关联的所有边,权和为si,最大边权为xi,则其关联边构成的子图最小路径数为ci=max(⌈si/2⌉,xi),枚举每条边(u,v,w),用并查集将两端点各自关联的所有边子图依次合并就可以得出答案,u,v合并的子图最小路径数为cu+cv−w。原创 2024-08-22 17:48:26 · 650 阅读 · 0 评论 -
UVa1664/LA6070 Conquer a New Region
本题直接思路是:找到边权最小的边(u,v),记其边权为w,将此边拿掉后变成两棵子树,设两子树的结点数分别为c[u]、c[v],两子树的最大容量之和分别为d[u]、d[v],根节点要么在子树u要么在子树v,因此答案为max(c[u]∗w+d[v],c[v]∗w+d[u]),递归处理子树即可求出d[u]、d[v]最终得到答案。但这时候的递归就不好写了,如果主体思路还是上面这样的话,考虑到结点数很大(n≤200000),不超时的方法应该是遍历排序后的树边顺便就把答案求出来了:利用并查集消除递归。原创 2024-08-20 20:51:33 · 993 阅读 · 0 评论 -
UVa1441/LA4619 Accountant notes
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 CERC 2009的A题 参照官方题解可以写出代码,这里说一些细节:建立trie时还需要辅助数组记录结点深度信息,d[u]表示的是结点u的子节点深度,因此根结点深度为d[1]=1,这样做在bfs计算失配指针和最后遍历答案时将带来便利;为区分终结符(自然数)和非终结符(name)并在结构上统一两者,可以将终结符s的key设定为其自然数的相反数(即-atoi(s)),非终结符的key设置为正值;对每个item,还用到两个结点EQ和ED(等号与换行)原创 2023-12-27 21:25:33 · 918 阅读 · 0 评论 -
UVa1462/LA4769 Fuzzy Google Suggest 坑点
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 坑点:如果空前缀(即字典树的根结点)在编辑距离内能变换成查询串,则结果为0。题意还是好理解的,做法也好想到。2009年哈尔滨G题。原创 2023-12-19 22:26:01 · 359 阅读 · 0 评论 -
UVa1513/LA5902 Movie collection
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 给你一叠DV,编号1到n,1在最上面,n在最下面。然后现在给你m个操作,每次都指定一张CD,问要拿走这个CD需要挪走上面多少张CD,并且这个要拿走的CD放在这个叠CD的顶端。将这些CD的上面有多少张CD用数状数组来存储,但是每次要移动的话就有点难办,所以每次移动就将这张CD的pos更新一下,将之前的pos作废,以后查询也是用之后的pos。转载 2023-11-23 20:41:38 · 38 阅读 · 0 评论 -
UVa1365/LA3525 Wild West
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 CERC'05的C题 先求出各个三元组代表的长方体体积并v,则答案就是m^3-v 如果切片操作再累加(即枚举z坐标)则可以转化成矩形面积并 似乎可以套用线段树扫描线模板 本题有一个特殊之处 所有矩形左下角都同一个点(0,0) 利用这一点可以对算法做优化 优化思路和《训练指南》3.5节例题Efficient Solutions相似 加入新点(矩形)时删除那些被其覆盖的矩形 维持点集的单调性(x递增且y递减) 可使用stl的set O(nlogn)原创 2024-01-03 03:21:11 · 320 阅读 · 0 评论 -
UVa1402/LA3961 Robotic Sort
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 CERC'07的S题,伸展树(splay)模板题,用懒标记表示反转提升效率,需要解决的一个难点:求特定结点的排名。给伸展树结点添加父指针字段,借助父指针可实现单次求特定结点排名的O(logn)时间复杂度算法。说一个用伸展树解题时缩短运行时间的技巧:初始化时将伸展树构建成平衡二叉树。原创 2024-01-04 21:24:07 · 371 阅读 · 0 评论 -
UVa11987 Almost Union-Find
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 并查集的删除操作可以通过增加结点实现:将所有实际结点的祖先设置为虚拟节点,实际结点删除时,修改其虚拟祖先即可。另外一个增加结点巧妙解决问题的经典例子是树状数组的应用上(Movie collection)。原创 2023-11-23 21:35:04 · 463 阅读 · 0 评论 -
UVa1493/LA5698 Draw a Mess
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 首先线段树可以做,并且行数很少,不需要用二维线段树,按行数开线段树数组即可。 但其实用并查集做更优,并查集在处理一些区间问题(区间合并快速跳表,区间覆盖路径压缩)上有奇效。并查集处理思路:对每行进行并查集路径压缩。倒着处理,相当于先涂上的颜色不会被后涂上的颜色覆盖,pa为下一个未涂色的结点,那么对行处理路径压缩就会跳过已经涂色的结点,比如当前行第i列涂完了下次就要涂pa[i+1],并且把pa[i+1]也赋给pa[i]。原创 2023-11-24 19:08:56 · 353 阅读 · 0 评论 -
UVa1502/LA5766 GRE Words 坑点
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 坑点:这题数据好像是出了点锅(SPOJ上这么说的),所以用除了scanf之外的读入方式可能会造成莫名其妙的TLE或者WA。原创 2023-12-20 23:48:15 · 351 阅读 · 0 评论 -
UVa12419 Heap Manager
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 利用优先级队列和普通队列即可模拟系统分配内存的过程 内存的分配与释放通过线段树来做,本题交代的内存总量是1e9级别的,因此需要动态开点的线段树来处理。如果区间范围是N,则单次点修改操作涉及到的区间结点数上限是⌈logN⌉+1,单次区间修改操作涉及到的区间结点数上限是4⌈logN⌉。单次操作涉及到的区间结点数上限,乘上不同操作次数上限,就得到了动态开点的结点数上限。原创 2024-01-07 21:43:21 · 866 阅读 · 0 评论 -
UVa1399/LA3907 Puzzle
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 给定m和n,表示有m种不同的字符(大写字母A,B,C⋯),n 个禁止串(n≤1000,每个串长度不超过50),请构造一个不包含任何禁止串的最长字符串并将其输出。如果可以无限长或者无解则输出No,如果存在多解则输出字典序最大那个。AC自动机加记忆化dfs。原创 2023-12-11 23:47:05 · 377 阅读 · 0 评论 -
UVa1492/LA5694 Adding New Machine
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 给你w*h个格子(1≤w,h≤10000000) 然后给你n(0≤n≤50000)个矩形,表示这些矩形所在的格子被占据。然后需要在同一直线上放一个长为m的新机器(不可经过被占据的格子)。问有多少种放的方法。这是线段树的经典应用:线段树求矩形面积并。具体来说有一个扫描线的的概念对数据做离散化处理,再构建线段树求面积并(其实就处理区间的覆盖与撤销)。原创 2023-11-27 23:42:57 · 414 阅读 · 0 评论 -
康托展开与求逆的一点总结
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 康托展开可以借助树状数组(BIT/Fenwick树)在O(nlogn)复杂度下实现。康托逆展开可以借助线段树在O(nlogn)复杂度下实现。原创 2023-11-21 06:44:05 · 45 阅读 · 0 评论