LibreOJ #144. DFS 序 1(dfs序+树状数组) Description: 这是一道模板题。 给一棵有根树,这棵树由编号为 1…N 的 N 个结点组成。根结点的编号为 R。每个结点都有一个权值,结点 i 的权值为 vi。 接下来有 M 组操作,操作分为两类: 1 a x,表示将结点 a 的权值增加 x; 2 a,表示求结点 a 的子...
经典用法: 配合树状数组进行区间修改,单点查询 代码实现 代码实现很简单,就是从根节点开始深搜,然后按顺序打标记就可以了。 但是打标记的地方可以有很多: id:DFS序列 in: 以u为根节点的子树的在dfs序列的起始位置。 out:以u为根节点的子树的在dfs序列的结束位置。 很明显,如果我们打了标记in和out,那么我们...
思路分析: 对于一颗树我们可以找到他的 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...
我们通过转化后的dfs序列,通过树状数组维护区间加减即可。 const int N = 5e5 + 100; int l[N],r[N]; vector<int> g[N]; int tot; template<class T> struct BIT { T c[N]; int size; void resize(int s) { size = s; for(int i = 1;i <= s;i ++) c[i] = 0; } T query(...
DFS序: 就是DFS整棵树依次访问到的结点组成的序列 DFS序性质:一颗子树的所有节点在DFS序内是连续的一段 剩下的就是区间求和问题了,用树状数组随便搞搞 这题还有个坑点是建边是单纯的vector会超时,需要建双重容器Orz(重要的是这题的方法,没去深究)
[MAXN]; // BIT维护点权的差分数组diff[] void addEdge(int a, int b) { edge[idx] = b, nxt[idx] = head[a], head[a] = idx++; } void dfs(int u, int fa) { dfn[u] = ++tim, siz[u] = 1, depth[u] = depth[fa] ^ 1; for (int i = head[u]; ~i; i = nxt[i])...
5465 62 20:41 App 【算法讲堂】【电子科技大学】【ACM】回文树 2.3万 380 37:14 App 【算法讲堂】【电子科技大学】【ACM】树状数组与ST表 1.5万 39 14:42 App 【算法讲堂】【电子科技大学】【ACM】博弈论基础 5776 8 9:28 App 【算法讲堂】【电子科技大学】【ACM】斯坦纳树 6705 8 9:21 App ...
int y=e[x][i];if(y==pre)continue;dfs(y,x,d+1);} R[x]=tot;} 给定⼀颗树, 和每个节点的权值.下⾯有7个经典的关于dfs序的问题:1. 对某个节点X权值加上⼀个数W, 查询某个⼦树X⾥所有点权的和.由于X的⼦树在DFS序中是连续的⼀段, 只需要维护⼀个dfs序列,⽤树状数组实现:...
BZOJ2819: Nim【树状数组+dfs序+倍增求LCA】 树上的Nim取石子游戏。 说白了就是,维护一棵树,支持:修改点权,询问一条路径上点权的xor值是否为零。 可以用树链剖分做。但是介于n和q都50w这么大感觉常数很DT。。 既然它只修改点的话,影响到的只是它这棵子树。那么很容易就想到了dfs序。这个子树就是连续一...
BZOJ2780:[Spoj]8093 Sevenk Love Oimaster 后缀自动机+离线+dfs序+树状数组- 思路: 首先建立多串后缀自动机(别问我怎么建的) 然后对于每个询问串在自动机上走,记录下走到的节点.那么在几个串中出现等价于逆序后缀树的子树中有几个原串的后缀. 转化为dfs序之后,这等价于每次