
树
文章平均质量分 53
f_zyj
一个追逐蝴蝶的人!
展开
-
牛客网-2018 美团 CodeM 编程大赛-初赛 A 轮-3-城市漫游
ACM模版描述 题解这个题出的十分好,让我回忆起了遗忘已久的一些东西。首先,题意是给定一个树,nnn 个结点,n−1n−1n - 1 条边,每条边有时间花费 ziziz_i,给定若干组起点 SSS 和 TTT,要求从 SSS 到 TTT 时,必须每条边都经过至少 lilil_i 次,问最少花费。这里,我们首先很容易想到的是应该和 SSS 到 TTT 的最短路径(这里的...原创 2018-06-10 00:54:39 · 753 阅读 · 0 评论 -
SHU-“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛-M-风力观测
ACM模版描述题解典型的线段树问题,但是在更新延迟标记时,会出现覆盖问题,所以呢,我们直接对偏移量进行处理,维护一下最大最小偏移量,进行延迟更新,可以避免覆盖带来的问题。具体看代码吧,区间更新,单节点查找,问题不大。代码#include <iostream>#include <cstdio>#include <cstring>#define clr(a, b) memset(a, b, size原创 2017-07-14 00:32:08 · 521 阅读 · 0 评论 -
HDU-5886-Tower Defence
ACM模版描述题解NN 个点的一棵边权树,切掉某条边的价值等于切后分成的两棵树的直径较大值。求切除任意一条边的价值总和。这个题是树归问题,通过两遍 dfsdfs 就能解决,和 51Nod51Nod 上的有一个求树的直径的问题很像,具体哪道我就记不清楚了,反正都是两遍 dfsdfs 解决的。这里第一遍 dfsdfs 求出每个 down[i][0]、down[i][1]、dis1[i]down[i][0原创 2017-07-02 17:07:16 · 374 阅读 · 0 评论 -
51Nod-1463-找朋友
ACM模版描述题解很容易就能看出来是线段树,也很容易就能发现自己不会写╮(╯﹏╰)╭找了 光速小子 的博客看了一下,发现这个线段树真的有些出人意表!这里通过离线手段,先将询问进行按右端点排序,然后逐个处理询问,询问时,通过右端点控制查找,因为集合 KK 的元素不超过十个,所以可以通过枚举其中一个 B[j]B[j] 和 K[k]K[k],来获取 BiB_i,对其进行判断是否存在,存在的话更新 tp原创 2017-07-01 20:43:33 · 380 阅读 · 0 评论 -
蓝桥-ALGO-20-求先序排列
ACM模版描述题解不管是要输出先序还是后序,只要给定中序和另外一种遍历,就可以求出来。根据各个序列之间的关系,很容易就能建树,然后再遍历一遍即可。代码#include <iostream>#include <string>using namespace std;typedef struct BTNode{ char data; struct BTNode *lc, *rc;}原创 2017-06-03 02:29:18 · 326 阅读 · 0 评论 -
计蒜客-2017 计蒜之道 初赛 第六场-C-微软大楼设计方案(中等)
ACM模版描述 题解我猜中了开头…… 刚拿到这个题时,我就分析出了需要用到单调栈,这样也许可以过 D(复杂)难度,但是具体怎么实施就不知道了,于是又想到可以用线段树,但是只能过 C(中等)难度,想过 B(简单)难度的方法有很多,除了上边这两种,最简单暴力的就是直接搜,当然,搜的方法也不止一种。最后只写出了中等难度的代码,线段树解,复杂度 O(m2logn)O(m^2logn),如果没记错的话就是原创 2017-06-05 23:22:18 · 623 阅读 · 3 评论 -
蓝桥-ALGO-27-FBI树
ACM模版描述题解实际上就是一个建树遍历树的过程,很简单,代码一看就知晓了……水题。不过,算是丰富了一个关于树的知识,原来还有名字这么霸气的一棵树啊!代码#include <iostream>#include <string>using namespace std;typedef struct BTNode{ char state; int l, r; BTNode *l原创 2017-06-05 03:55:09 · 421 阅读 · 0 评论 -
HDU-5877-Weak Pair
ACM模版描述题解线段树或者树状数组都能搞,这里使用的是树状数组。首先我们将 aia_i 和 ⌊k/ai⌋\lfloor {k / a_i} \rfloor 统一保存然后排序去重,对应结点建立映射(结点权值在序列中的位置),接着,一遍 dfs() 不断加点删点,搜索过程中,进行求和计数。描述起来并不是特别容易理解,还是细细品味代码吧~~~代码#include <iostream>#include原创 2017-05-16 20:17:49 · 335 阅读 · 0 评论 -
51Nod-1273-旅行计划
ACM模版描述题解通过题意,我们可以清晰的知道,每天到达的结点一定是叶子结点,所以我们先 dfs 遍历一遍树,将说有的叶子结点x入vn2,这里我们附带还要入一个叶子节点的深度d,为了保证未经过的城市最多,当然,光这样还是无法保证未经过的城市最多,因为不同的叶子结点到根节点的路径会有重合,所以我们需要从所有叶子结点开始向前访问一遍(访问之前需要进行一次排序,保证未经过的城市最多,同样多时,保证编号最小原创 2017-04-17 16:10:29 · 1062 阅读 · 5 评论 -
51Nod-1199-Money out of Thin Air
ACM模版描述题解树链剖分 + 线段树搞搞,十分不错的一道题,折腾了好久才搞定……其实也不难,树链剖分算是一个比较简单的算法了,最起码好理解,两个 dfs 搞搞事情,获得一个树与链的映射关系即可,然后用这个链来进行线段树的相关处理。代码#include <cstdio>#include <cstring>#include <cctype>#include <algorithm>#define原创 2017-04-09 19:29:22 · 440 阅读 · 0 评论 -
51Nod-1737-配对
ACM模版描述题解这个问题实际上是找树的重心,只要找到重心 dfs 遍历一遍求各个路径的权值,各点到重心的权值之和就是最大距离总和。至于怎么找重心,其实也是一遍 dfs,有固定的模版,代码不难理解。说以这个问题只需要先 dfs 一遍找到树的重心,然后再 dfs_ 一遍求各个点到重心的路径权值,最后,累加各个点的路径权值即可。代码#include <cstdio>#include <cstring>原创 2017-03-13 13:39:58 · 575 阅读 · 0 评论 -
51Nod-1603-限高二叉排列树
ACM模版描述题解题目好长,长得我看了两遍都没有看懂,看来学理工科时间长了,语文水平有所下降。简单地说,也就是求 n 个结点所能构成的高度大于等于 h 的二叉树种数。典型的 dp 问题,设 dp[i][j] 表示 i 个结点且高度小于等于 j 的树个数,中间利用乘法原理合并树累加求各个状态结果,最后输出 dp[n][n] - dp[n][h - 1] 即可。代码#include <iostream>原创 2017-03-07 17:18:45 · 563 阅读 · 0 评论 -
THU-2016-3-1-TSP
ACM模版描述 题解树归问题,名字虽然叫TSP,却和TSP没有啥关系,一道典型的树归问题。当然,方法不止一种,还可以先用拓扑排序预处理一下。代码#include <cstdio>#define MAX_N 100005#define MAX_M 1000005#define max(a, b) ((a > b) ? (a) : (b))using namespace std;const int原创 2016-12-17 11:12:38 · 803 阅读 · 5 评论 -
HDU-2489-Minimal Ratio Tree
ACM模版描述题解dfs+最小生成树,十分巧妙的题,枚举n个点的m个点组合,对每种组合进行最小生成树计算,把最小的情况输出即可。代码#include <cstdio>#include <cstring>const int INF = 0x3f3f3f3f;const int MAXN = 20;int n, m;int vis[MAXN];int ans[MAXN];int pre[MAX原创 2016-11-02 20:49:19 · 581 阅读 · 0 评论 -
HDU-3938-Portal
ACM模版描述题解必须说,这道题超出了我的英语水平,拆开了每个字母都认识,合起来,一半单词不认识,全篇,无尽懵逼……说得神马鬼!!!网上找了相关的题解,稍稍懂了些,是求满足点对儿之间路径存在最大花费段不超过q的点对儿数目,像克鲁斯卡尔,用并查集搞搞。代码#include <cstdio>#include <cstring>#include <iostream>#include <algorit原创 2016-11-02 19:50:58 · 587 阅读 · 0 评论 -
HDU-1598-find the most comfortable road
ACM模版描述题解克鲁斯卡尔+并查集……代码#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 210; // 最大点数const int MAXM = 1010; // 最大边数const int INF = 0x3f3f3f3f;int pre[MA原创 2016-11-02 00:10:48 · 421 阅读 · 0 评论 -
HDU-1162-Eddy's picture
ACM模版描述题解和HDU-1875-畅通工程再续几乎一模一样啊,最小生成树。 做这两道题时注意到一个小问题,对double cost[][]初始化时不能用mem(cost, 0x3f),因为是double型,以前从没有注意过这个问题。代码#include <iostream>#include <cstring>#include <cmath>#define mem(a, b) memset(原创 2016-11-01 02:40:35 · 474 阅读 · 0 评论 -
51Nod-1299-监狱逃离
ACM模版描述题解先吐槽一下,我只想说,搞 ACM 的人语文表达能力真的很有限,说得云里雾里的……一开始有思路,瞄了一眼讨论区,思路彻底被搞蒙了,这表达能力堪忧啊~~~抑或是我的语文理解能力低下?这个题能够用最小割解,十分不错,反正我不会,也就点点赞~~~我用的是树归,因为很明显是 dp,又是树,所以就是树归喽~~~建图,不多说,保存一下每个点的度,根据度,判断 −1-1,然后随便找一个度为 11原创 2017-06-14 23:53:24 · 588 阅读 · 0 评论 -
51Nod-1494-选举拉票
ACM模版描述题解线段树的题倒是做过一些,但是和扫描线组合的倒是第一次做,以前甚至不知道什么叫做扫描线,做了这个题感觉有那么丢丢感觉了。首先,我们默认要拉所有选民,然后开始减少要拉的选民数。这是中心思想。具体的实现方式是,我们先对每个人的选民进行代价排序,然后扫描出来每个候选人的选民的代价 rankrank,同等 rankrank 的放在一起,你要是问什么是 rankrank 的话,举个最简单的例子原创 2017-07-15 21:27:43 · 998 阅读 · 1 评论 -
51Nod-1766-树上的最远点对
ACM模版描述题解好题,逻辑十分强大。LCA + 线段树。首先需要说的是,两个区间之间任选一点的最大距离是什么?这个其实并不难理解,我们知道一个树的直径是他内部的两个距离最远的两个点,这两个点也就是直径的两端,那么这两个区间实际上我们可以抽象为一个虚树,而每个虚树都有自己的直径,这两个直径分别有两个端点,那么我们应该可以想到,这个最远的距离实际上直接受这四个点的影响。这两个直径的端点之间的距离有一个原创 2017-07-07 13:12:13 · 1360 阅读 · 0 评论 -
CF-Avito Code Challenge 2018-C-Useful Decomposition
ACM模版描述 题解题意弄懂了这个题就是很水的题,给定一个棵树,让你判断,它是否是放射状的,也就是说,这棵树是否是由一个根结点让外延伸了若干条链,并且每条链不能分叉;如果这个树不是放射状的,那么就 NoNoNo。所以,这个题也就是先找根,肯定只有根的 E[i].size()>2E[i].size()>2E[i].size() > 2,遍历一遍查找,如果找到了不...原创 2018-05-28 16:53:30 · 279 阅读 · 0 评论 -
51Nod-1981-如何愉快地与STL玩耍
ACM模版描述题解线段树 + bitsetbitset + 二分 + 输入外挂 + 输出外挂 + Visual C++\text{Visual C++}……运气好可以卡过!代码#include #include #include #include using namespace std;const int MAXN = 65540;const原创 2018-01-05 19:15:14 · 1060 阅读 · 3 评论 -
51Nod-1805-小树
ACM模版描述题解最近懒了好多,51Nod51Nod 也好久没有添加题了,所以到今天才发现 优快云优快云 编辑中心改版了,感觉还挺有趣的,但是编辑区太小了,不知道会不会不适应。直接给一下官方题解吧!话说,第二类斯特灵数是啥子?不是斯特林吗?不过这个题网上有大佬提到了 pruferprufer 序列,好像有着密切的关联,毕竟这些树都在空中漂浮不在地面着根。代码原创 2018-01-05 18:28:48 · 632 阅读 · 0 评论 -
HDU-5575-Discover Water Tank
ACM模版描述题解左偏树可解。初始默认所有 z=0z = 0 的情况,然后枚举 z=1z = 1 的情况来更新答案,并且可以用并查集来维护合并的水箱,既然水箱要合并,那么计算水箱的合并用可并堆比较快,可并堆中比较常用编码难度比较低的数到左偏树了。这里由于需要向左向右进行查找挡板,合并后就忽视掉中间的挡板从而视作一个整体,所以仿真链式存储结构比较好。代码#include <iostream>#inc原创 2017-11-21 22:17:11 · 596 阅读 · 0 评论 -
HDU-3672-Caves
ACM模版描述题解树型 DPDP。设 dp[i][j][k]dp[i][j][k] 表示以 ii 为子树根遍历 jj 个结点,k=0k = 0 表示遍历结束回到该子树根,k=1k = 1 表示不回。对于 k=0k = 0 的情况,当遍历子结点时,可以考虑原本的有返回遍历路径插入对应子结点的有返回遍历路径及衔接这两条路径的花费; 对于 k=1k = 1 的情况,当遍历子结点时,可以考虑原本的无返回遍原创 2017-10-12 17:55:25 · 364 阅读 · 0 评论 -
51Nod-1832-先序遍历与后序遍历
ACM模版描述题解官方题解的思路十分的清晰,所以先看看官方题解:也就是说决定树的种类的是只拥有一个儿子的结点个数 ctct,最后结果为 2ct2^{ct}。由于这里的总结点数十分大,所以这里的结果将会是一个大数,那么我们顺其自然的引入大数,当然,如果你害怕不够快,可以再加上一个快速幂,当然,不加也是稳稳的,当然,剩下的就没有啥了……看看代码体会一下吧~~~需要熟练掌握先序和后序遍历的性质。代码#in原创 2017-09-04 20:27:00 · 503 阅读 · 0 评论 -
主席树
ACM模版查询区间有多少个不同的数/* * 给出一个序列,查询区间内有多少个不相同的数 */const int MAXN = 30010;const int M = MAXN * 100;int n, q, tot;int a[MAXN];int T[MAXN], lson[M], rson[M], c[M];int build(int l, int r){ int ro原创 2016-07-21 03:42:04 · 1705 阅读 · 1 评论 -
51Nod-1175-区间中第K大的数
ACM模版描述题解遇见这种题,果断直接套模版,主席树,也就是可持久化线段树。这里需要说一下,由于比较懒,我的模版求得是第 K 小,并且下标是从 0∼n0 \sim n,所以呢,我直接在输出时下标偏移了一,并且对 kk 稍加修饰,变成了求第 r−l+2−kr - l + 2 - k 小的数,效果是一模一样的,就酱紫。代码#include <cstdio>#include <cstring>#inc原创 2017-08-06 20:03:08 · 668 阅读 · 1 评论 -
51Nod-1679-连通率
ACM模版描述题解很明显的树归问题,但是状态如何转移帮不好想,第一次见到这个题是我刚开始做 51Nod51Nod 时候的一场算法马拉松,很明显,那时候我并不会做,也不知道什么叫做树归,就一直没有再碰过了。今天看到这个题忽然想起来了,但是依然不知道具体怎么转移,先给一下官方题解吧……感觉这个转移很套路,其实可以理解为,在合并两个块儿时,左边块儿的贡献变为了右边块儿结点数的 22 次幂,但是不考虑两个块原创 2017-07-28 22:03:32 · 446 阅读 · 0 评论 -
线段树专项训练习题集
ACM模版线段树专项训练开始了,网上找了找相关的训练题,但是没有找到好的集锦,也只好作罢,自己根据前辈们的博客整理出来一份习题集吧,想来一下子全部整理出来不如一道道尝试,一道道整理,这样子可以给不同的试题更好的定位,所以,从今天开始,陆陆续续会更新本习题集,希望对大家以及我自己有更好的帮助。更新结点,区间求和HDU 1166 敌兵布阵更新结点,区间最值HDU 1754 I Hate It原创 2017-01-10 17:34:10 · 2209 阅读 · 3 评论 -
HDU-2017 多校训练赛4-1004-Dirt Ratio
ACM模版描述题解十分巧妙的题,只是好考验英语水平啊……给定一个序列,求所有区间中的 不同数字的个数 / 区间长度 的最小值。这里用得是二分答案,线段树维护区间最小即可。官方题解:代码#include <cstdio>#include <iostream>#define lson rt << 1#define rson rt << 1 | 1using namespace std;const i原创 2017-08-04 19:00:02 · 448 阅读 · 2 评论 -
51Nod-1593-公园晨跑
ACM模版描述题解十分有趣的一个问题,用到线段树了……我学姐写这个题解十分的详细,我想我一定不会写的更详细,所以直接给大家一个我学姐的博客吧,可以去哪儿看一下题解……但是学姐的线段树写得真让人感觉不习惯,所以我自己只贴一下代码吧!>>>佐理慧的 blog<<< 点赞点赞点赞!!!代码#include <stdio.h>#include <algorithm>#include <string.h>原创 2017-07-27 01:12:53 · 523 阅读 · 0 评论 -
HDU-2017 多校训练赛3-1004-Kanade's trio
ACM模版描述题解这个题思路十分巧妙,没想到竟然可以用字母树解。题解不难理解,就是有些出人意料了。看了题解后,我拿着官方题解,参考着写了一份,习惯性的将一些东西改成了自己的习惯……比如说,初始化能用 memset()memset() 的都用 memset()memset(),然后我就超时了……,很纳闷儿,再三斟酌,我尝试将初始化改成了循环初始化,发现一下子竟然 ACAC 了。这是最让我十分意外的,我原创 2017-08-02 23:16:27 · 699 阅读 · 0 评论 -
51Nod-1781-Pinball
ACM模版描述题解动态规划 + 线段树 + 离散化优化。首先,我们说一下为什么是动态规划,题目要求无论从哪儿开始,都要落在一个位置,那么也就意味着他最后一定要从第 ii 个漏斗落下来,那么,我们需要考虑从最左边和最右边开始一直到 ii 结束的最小花费,因为只要从两端开始都能达到这个最终状态,那么中间任意位置开始都是没问题的。所以,此时我们应该设 l[i]、r[i]l[i]、r[i],分别表示从两端位原创 2017-07-21 18:33:18 · 394 阅读 · 0 评论 -
51Nod-1806-wangyurzee的树
ACM模版描述题解尝试了这个题,百度到需要用到一种我没有接触过的序列,叫做 prufer 序列,十分强大的一个工具,网上查查能查到很多关于这个的讲解,这里有一个比较重要的是,prufer 序列的每一种序列对应一种生成树,序列中每个结点出现的次数比每个结点在该生成树中的度数少一,然后就是组合容斥的问题了。贴一下官方题解,和网上大神们讲的没有太大区别。这里注意要用到欧拉函数法求阶乘逆元,因为组合的公式里原创 2017-07-09 20:24:58 · 558 阅读 · 0 评论 -
51Nod-1571-最近等对
ACM模版描述题解挺常见的一种线段树问题,首先对 a[]a[] 进行离散化,然后询问离线处理,处理时需要根据右区间进行排序,然后不断维护左区间就好了……每次添加离散化后的 a[i]a[i] 时都要处理完询问中右区间端点为 ii 的查询,避免后续添加对它的影响。区间更新,区间查询,注意延迟标记。代码#include <iostream>#include <cstdio>#include <algo原创 2017-07-30 02:48:24 · 497 阅读 · 0 评论 -
HDU-1301-Jungle Roads
ACM模版描述题解模版题,就是英文有些长了,真咋呼人,看了好久没看懂……最小生成树。代码#include <iostream>#include <cstring>#define mem(a, b) memset(a, b, sizeof(a))using namespace std;/* * Prim求MST * 耗费矩阵cost[][],初始化为INF,标号从0开始,0 ~ n-1 * 返原创 2016-11-01 01:16:55 · 353 阅读 · 0 评论 -
HDU-3371-Connect the Cities
ACM模版描述题解算法本身并不难,但是貌似题有些古怪了……直观的算法也就是最小生成树(克鲁斯卡+并查集)。感觉我的代码没啥问题啊,可是一直有问题,先mark一下吧~~~代码#include <cstdio>#include <cstdlib>using namespace std;/* * Kruskal算法求MST * 对边操作,并排序 */const int MAXN = 510;原创 2016-10-30 23:34:44 · 550 阅读 · 0 评论 -
HDU-1879-继续畅通工程
ACM模版描述题解最小生成树模版题。代码#include <iostream>#include <cstring>#define mem(a, b) memset(a, b, sizeof(a))using namespace std;/* * Prim求MST * 耗费矩阵cost[][],初始化为INF,标号从0开始,0 ~ n-1 * 返回最小生成树的权值,返回-1表示原图不连通 *原创 2016-10-30 01:15:31 · 355 阅读 · 0 评论 -
伸展树
ACM模版伸展数/* * 伸展树(Splay Tree) * 题目:维修数列。 * 经典题,插入、删除、修改、翻转、求和、求和最大的子序列 */#define Key_value ch[ch[root][1]][0]const int MAXN = 500010;const int INF = 0x3f3f3f3f;int pre[MAXN], ch[MAXN][2], key原创 2016-07-20 22:22:37 · 1321 阅读 · 0 评论