LibreOJ #144. DFS 序 1(dfs序+树状数组) Description: 这是一道模板题。 给一棵有根树,这棵树由编号为 1…N 的 N 个结点组成。根结点的编号为 R。每个结点都有一个权值,结点 i 的权值为 vi。 接下来有 M 组操作,操作分为两类: 1 a x,表示将结点 a 的权值增加 x; 2 a,表示求结点 a 的子...
思路:树状数组主要针对的是区间(而且是一条线段的)求和问题,所以需要利用dfs序和数组 in [ ], out [ ] (前缀和原理),利用dfs进行搜索,每个点依次被访问的顺序就是每个点的dfs序,out [ i ] - in [ i ] 即为子树 i 的区间, 这样就将一棵树记录到了树状数组上。 代码: 链式前向星+dfs序+树状数组 Vi...
思路分析: 对于一颗树我们可以找到他的 dfs序,将其变成一维的数组的结构,在寻找的同时再添加一个时间戳,然后树状数组维护下标就可以,当然主席树也可以代码示例 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40...
(2)Q x :查询点x的所有子节点(包括x)的权值和 dfs序模板题,巧妙的利用dfs序的性质 DFS序: 就是DFS整棵树依次访问到的结点组成的序列 DFS序性质:一颗子树的所有节点在DFS序内是连续的一段 剩下的就是区间求和问题了,用树状数组随便搞搞 这题还有个坑点是建边是单纯的vector会超时,需要建双重容器Orz(重要...
树状数组套一个线段树: #include<bits/stdc++.h> using namespace std; #define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl '\n' const int N=2e5+5; struct Trie{ int tr[N][27]; int tot_dfs,cnt_node,dfsl[N],dfsr[N]; int insert(string str){...
DFS序为pos的节点的权值的增量 int res = 0; for (int i = pos; i; i -= lowbit(i)) res += BIT[op][i]; return res; } void modify(int u, int v) { // 令节点u的点权+=v add(depth[u], dfn[u], v), add(depth[u], dfn[u] + siz[u], -v); } } using namespace DFS...
BZOJ2819: Nim【树状数组+dfs序+倍增求LCA】 树上的Nim取石子游戏。 说白了就是,维护一棵树,支持:修改点权,询问一条路径上点权的xor值是否为零。 可以用树链剖分做。但是介于n和q都50w这么大感觉常数很DT。。 既然它只修改点的话,影响到的只是它这棵子树。那么很容易就想到了dfs序。这个子树就是连续一...
BZOJ2780:[Spoj]8093 Sevenk Love Oimaster 后缀自动机+离线+dfs序+树状数组- 思路: 首先建立多串后缀自动机(别问我怎么建的) 然后对于每个询问串在自动机上走,记录下走到的节点.那么在几个串中出现等价于逆序后缀树的子树中有几个原串的后缀. 转化为dfs序之后,这等价于每次
【Gym 102134-E】Kth subtree【权值树状数组、二分统计第k大+dfs离线操作】,程序员大本营,技术文章内容聚合第一站。
dfs序后,子树都处于一个区间里,所以问题就转化成了单点修改、区间求和。 用树状数组维护即可。 代码: #include<bits/stdc++.h>typedeflonglongll;usingnamespacestd;constintmaxn=1e6+7;intn,m,k;inth[maxn],idx;structnode{inte,ne; }edge[maxn*2]; ...