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序和数组 in [ ], out [ ] (前缀和原理),利用dfs进行搜索,每个点依次被访问的顺序就是每个点的dfs序,out [ i ] - in [ i ] 即为子树 i 的区间, 这样就将一棵树记录到了树状数组上。 代码: 链式前向星+dfs序+树状数组 Vi...
dfs序模板题,巧妙的利用dfs序的性质 DFS序: 就是DFS整棵树依次访问到的结点组成的序列 DFS序性质:一颗子树的所有节点在DFS序内是连续的一段 剩下的就是区间求和问题了,用树状数组随便搞搞 这题还有个坑点是建边是单纯的vector会超时,需要建双重容器Orz(重要的是这题的方法,没去深究) #include #include<stack...
我们通过转化后的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(...
树状数组套一个线段树: #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){...
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序之后,这等价于每次