
dfs序&树链剖分
文章平均质量分 57
cillyb
这个作者很懒,什么都没留下…
展开
-
CodeForces 593D Happy Tree Party(树链剖分(边权) or LCA+并查集)
题意:给你一棵数,n个点n-1条边,每条边有个权值,q次询问,询问有两种:1 a b y : a到b的路径上不断进行y = y/xi(像下取整),问最后y的值2 p c : 将第p条边的权值改为c,c一定比原来这条边的值小思路:树剖:线段树记录区间的乘积,查询的时候当两者重链的top相等的时候注意去掉top点的权值。每条边的权值都是在1e18内,所以如果线段树某个元素原创 2017-08-09 01:32:40 · 669 阅读 · 0 评论 -
POJ 2763 Housewife Wind(树链剖分(边权))
题意:给你一颗树,树边带权,q次询问,两种操作:0 u : 求从当前位置到u路径的边权和,(下一次操作时起始位置变成了u)1 i w : 将第i条边的权值改为wn 思路:还是一个裸的树剖,练练写树剖的熟练度。还有这题貌似卡vector?以后安起见都改用前向星写吧。代码:#include#include#include#include#includ原创 2017-08-09 16:55:59 · 415 阅读 · 0 评论 -
HDU 5877 Weak Pair (dfs 树状数组 || dfs序 主席树)
题意:给你一颗树,每个节点有一个权值,给你一个k,问你满足a[u]*a[v] 思路:做的时候看到u和v又是子树关系,想当然就是dfs序啦,然后变成a[v]树中点开),所以直接敲了dfs序+主席树。。其实这题有简单做法,我们可以在dfs整棵树过程中计算每个点作为儿子节点的贡献,贡献即为其祖先节点u, k/a[u] >= a[v]的个数。因此可以用树状数组维护从原创 2017-09-03 21:04:35 · 353 阅读 · 0 评论 -
BZOJ 1036 树的统计Count(树链剖分(点权)入门题)
题意:给你一个n个节点的一棵树,每个节点有一个权值,现在q次操作,操作有三种:Change x y : 将x节点的权值改成yQMAX x y : 问你x到y路径上的最大值QSUM x y: 问你x到y路径上的权值和思路:第一个树剖题,树剖裸题,剖完后直接线段树查询即可。num[]数组,用来保存以x为根的子树节点个数top[]数组,用来保存当前节点的所在链的顶端节点原创 2017-08-08 01:05:40 · 513 阅读 · 0 评论 -
HDU 6162 Ch’s gift(树链剖分+线段树)
题意:给你一颗树,每个节点有一个值,q次询问,每次询问u到v的路径上节点权值在a至b的节点的权值和。n,q思路:可以离线处理,分别求出路径中代码:#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5;int deep[maxn], fa[maxn], top[maxn]原创 2017-08-22 20:45:19 · 755 阅读 · 0 评论 -
CodeForces 343D Water Tree(dfs序 线段树)
题意:给你一颗n个节点的树,1为根,初始时所有节点都为0,有三种操作:1 x :将x及其子树的所有节点都变为12 x :将x及其祖先都变为03 x :查询x的值思路:可以先求出dfs序,对于操作1,我们可以用线段树区间更新in[x]至out[x];对于操作2,需要更新它及其祖先,不太好操作,我们可以只将x变为0,这样对于操作3,我们可以查找其子树最小值,如果是0就代表它原创 2017-08-07 00:23:50 · 458 阅读 · 0 评论 -
HDU 6191 Query on A Tree (dfs序+可持久化01Trie)
题意:给你一棵树,每个节点有一个权值,q次询问,每次询问求以u为根节点的子树异或上x的最大值。n,q 思路:要解决子树的问题,那么就是dfs序,解决异或最大值,那么就是01Trie,然后这题需就是根据dfs序建立可持久化01Trie就好了。代码:#includeusing namespace std;const int maxn = 1e5+5;const i原创 2017-09-03 18:05:34 · 558 阅读 · 0 评论 -
HDU 5029 Relief grain(树链剖分+线段树)
题意:给你一颗n个节点的树,现在执行m次操作,每次操作[a, b, k]表示a到b的路径上的所有点都加上一个颜色k。m次操作之后输出每个点的出现次数最多的那个颜色(若有多个颜色输出值最小的)。n, m, k 思路:我们可以先把他想成在区间上执行操作,这样题意就变成了:一个区间[1, n],m次操作[a, b, k],表示a-b区间每个节点添加一个颜色k,mci曹组后输出n个数,原创 2017-10-03 16:14:57 · 503 阅读 · 0 评论 -
树上差分
1.给你一些路径,找出被所有路径都覆盖的边(BZOJ4326)思路: 将所有路径的起点、终点权值加1,起点终点的lca权值减2,dfs序累加。最终权值为路径数的点到其父亲的边为所求边。2.给你一些路径,每条路径(u,v)上的每个点权值增加1,求各个点的权值(BZOJ3631)(给你一些路径,求树上每个结点被路径覆盖的次数)思路:将所有路径的起点、终点权值加1,起点终原创 2017-10-20 23:02:11 · 782 阅读 · 0 评论