[Vani有约会]雨天的尾巴 LG传送门 线段树合并入门好题. 先别急着上线段树合并,考虑一下这题的暴力.一看就是树上差分,对于每一个节点统计每种救济粮的数量,再一遍dfs把差分的结果统计成答案.如果暴力统计,即对于每一个点开一个数组记录每种救济粮的数量,统计时再\(O(S)\)(设\(S\)为救济粮的种类数)地合并两个节点的信息,无论时间还是空间都是无法承受的,于是考虑优化. 容易想到对于每一个点开一棵值域线段树记录区间内救济粮最多的种类和相应的个数,但是这样还是会炸,所以不能用一般的线段树,…
[BZOJ3307]雨天的尾巴 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. Input 第一行数字N,M接下来N-1行,每行两个数字a,b,表示a与b间有一条边再接下来M行,每行三个数字x,y,z.如题 Output 输出有N行每i行的数字表示第i个点存放最多的物品是哪一种,如果有多种物品的数量一样,输出编号最小的.如果某个点没有物品则输出0 题解:看到题直…
题目链接 题目大意:给定一颗含有$n$个结点的树,每次选择两个结点$x$和$y$,对从$x$到$y$的路径上发放一带$z$类型的物品.问完成所有操作后每个结点发放最多的时哪种物品. 普通的树链剖分貌似也可以做这道题,可以记录一个$c$数组用来记录结点中每种物品的个数,然后暴力乱搞.空间可能会炸. 这时候我们需要一种新算法:树上差分. 关于树上差分,有需要的同学可以去看大佬的博客,我这里说一下思想. 对于序列的差分,我们都知道,假设让序列中$i-j$的数都加上$z$,那么直接让差分数组$b[i]+…
傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩. 有什么用? 线段树功能强大,支持区间求和,区间最大值,区间修改,单点修改等操作.线段树的思想和分治思想很相像.线段树的每一个节点都储存着一段区间[L-R]的信息,其…
题目大意: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.问完成所有发放后,每个点存放最多的是哪种物品. 题解: 首先我们为每一个节点都开一个线段树 然后我们进行树上路径差分: 对于一个从u->v的路径,我们将其分解为: u->1 , v->1,fa[lca(u,v)] -> 1 lca表示最近公共祖先,fa[x]为x的父亲节点 所以我们需要附加权值 我们可以在u的线段树上加上1 在v的线段树上加上1 在lca(u…
题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入 第一行数字N,M接下来N-1行,每行两个数字a,b,表示a与b间有一条边再接下来M行,每行三个数字x,y,z.如题 输出 输出有N行每i行的数字表示第i个点存放最多的物品是哪一种,如果有多种物品的数量一样,输出编号最小的.如果某个点没有物品则输出0 样例输入 20 50 8 6 10 6 18 6 20 10 7 20 2…
正解:线段树合并 解题报告: 传送门! 考虑对树上的每个节点开一棵权值线段树,动态开点,记录一个max(num,id)(这儿的id,define了一下,,,指的是从小到大排QAQ 然后修改操作可以考虑树上差分,大概形式就tr[l]++,tr[r]++,tr[lca]--,tr[lca.fa]-- 然后最后求和的时候从底向上合并一边合并一边输出就好 然后这题是有点儿卡空间的(但是我开始学的时候就学的是比较节省空间的那种,,,所以其实并麻油卡住我23333 但是还是总结下线段树合并的几个比较常见的省…
题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一片狼藉. 无奈的深绘里和村民们只好等待救济粮来维生. 不过救济粮的发放方式很特别. 题目描述 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋z类型的救济粮. 然后深绘里想知道,当所…
使用线段树合并,每个节点维护一棵权值线段树,下标为救济粮种类,区间维护数量最多的救济粮编号(下标).所以每个节点答案即为\(tre[rot[x]]\). 然后运用树上点的差分思想,对于分发路径\(u,v\),我们在\(u\)上+1,在\(v\)+1,在\(lca(u,v)\)处-1,在\(fa(lca)\)处-1,最后统计时自底向上做树上前缀和.线段树合并即得当前节点信息. 需要注意的是,在合并时可能会出现\(tre[rot[x]]\)不为\(0\),但是\(sum[rot[x]]\)为\(0\…
虽然是个板子,但用到了差分思想. Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. Solution 离线记录所有操作后把物品编号离散化, 之后修改路径信息时用到了点差分的思想.在线段树中记录差分数据,最后由叶节点开始合并,通过子树求和算出该点实际数据. 每次更改时只在两端点处加1,在lca处减1,再在lca父亲处减1即可.应该很好理解. 另外,应用边差分时,要现…