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 · 760 阅读 · 0 评论 -
POJ 2763 Housewife Wind(树链剖分(边权))
题意:给你一颗树,树边带权,q次询问,两种操作: 0 u : 求从当前位置到u路径的边权和,(下一次操作时起始位置变成了u) 1 i w : 将第i条边的权值改为w n 思路:还是一个裸的树剖,练练写树剖的熟练度。还有这题貌似卡vector?以后安起见都改用前向星写吧。 代码: #include #include #include #include #includ原创 2017-08-09 16:55:59 · 468 阅读 · 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 · 403 阅读 · 0 评论 -
BZOJ 1036 树的统计Count(树链剖分(点权)入门题)
题意:给你一个n个节点的一棵树,每个节点有一个权值,现在q次操作,操作有三种: Change x y : 将x节点的权值改成y QMAX x y : 问你x到y路径上的最大值 QSUM x y: 问你x到y路径上的权值和 思路:第一个树剖题,树剖裸题,剖完后直接线段树查询即可。 num[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点原创 2017-08-08 01:05:40 · 586 阅读 · 0 评论 -
HDU 6162 Ch’s gift(树链剖分+线段树)
题意:给你一颗树,每个节点有一个值,q次询问,每次询问u到v的路径上节点权值在a至b的节点的权值和。 n,q 思路:可以离线处理,分别求出路径中 代码: #include using namespace std; typedef long long ll; const int maxn = 1e5+5; int deep[maxn], fa[maxn], top[maxn]原创 2017-08-22 20:45:19 · 818 阅读 · 0 评论 -
CodeForces 343D Water Tree(dfs序 线段树)
题意:给你一颗n个节点的树,1为根,初始时所有节点都为0,有三种操作: 1 x :将x及其子树的所有节点都变为1 2 x :将x及其祖先都变为0 3 x :查询x的值 思路:可以先求出dfs序,对于操作1,我们可以用线段树区间更新in[x]至out[x];对于操作2,需要更新它及其祖先, 不太好操作,我们可以只将x变为0,这样对于操作3,我们可以查找其子树最小值,如果是0就代表它原创 2017-08-07 00:23:50 · 520 阅读 · 0 评论 -
HDU 6191 Query on A Tree (dfs序+可持久化01Trie)
题意:给你一棵树,每个节点有一个权值,q次询问,每次询问求以u为根节点的子树异或上x的最大值。n,q 思路:要解决子树的问题,那么就是dfs序,解决异或最大值,那么就是01Trie,然后这题需就是根据dfs序建立可持 久化01Trie就好了。 代码: #include using namespace std; const int maxn = 1e5+5; const i原创 2017-09-03 18:05:34 · 646 阅读 · 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 · 624 阅读 · 0 评论 -
树上差分
1.给你一些路径,找出被所有路径都覆盖的边(BZOJ4326) 思路: 将所有路径的起点、终点权值加1,起点终点的lca权值减2,dfs序累加。 最终权值为路径数的点到其父亲的边为所求边。 2.给你一些路径,每条路径(u,v)上的每个点权值增加1,求各个点的权值(BZOJ3631) (给你一些路径,求树上每个结点被路径覆盖的次数) 思路:将所有路径的起点、终点权值加1,起点终原创 2017-10-20 23:02:11 · 880 阅读 · 0 评论
分享