dfs序3--树上差分 对节点X到Y的最短路上所有点权都加一个数W, 查询某个点的权值 解: 这个操作等价于 a. 对X到根节点路径上所有点权加W b. 对Y到根节点路径上所有点权加W c. 对LCA(x, y)到根节点路径上所有点权值减W d. 对LCA(x,y)的父节点 parent(LCA(x, y))到根节点路径上...
考虑将点一层层加进去,利用set查找dfs序中前驱后继同色点,对dfs序建线段树实现动态树上差分。于是再对深度建主席树就可以在线回答询问了。 #include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<vector>#include<set>usingnamespacestd;#definell long ...
二、DFS序性质 我么会发现对于图中的三棵子树他们的DFS序连续: A-B-C-D-E-F-G-H B-C-D-E F-G-H 也就是说在一棵子树上的DFS序,他们一定是连续的,那么我们可以做树上的差分,这里可以保留一下,稍后填坑。 一、什么是时间戳: 时间戳我们有两个标记第一个是第一次访问的时候记录一下,然后是在最...
给一棵 个点的树。有如下询问。 1 x y,将 点的点权改成 。 2 x,询问 点子树的点权和,到根的路径的点权和。 对于第一种 子树点权和 的计算类似于前一题。对于第二种 点到根的路径的点权和,可以利用差分数组进行计算。 const int N = 2e5 + 100; int l[N],r[N]; vector<int> e[N]; ...
树链剖分总结(讲解) 前言 我们在进行树上操作时往往会遇见一下操作:将u\ u u节点到v\vv节点的最短路径上所有节点全部加上一个数k\ k k。求u\ u u节点到v\vv几点的最短路径上所有点权之和。求以u\ u u为根的子树的点权之和。 若单独处理这些问题是容易的(差分,LCA,DFS预处理)。但这些操作混到...
所以问题转化为:查询点x到根节点的链上的所有节点权值和。 修改节点x权值,当且仅当y是x的子孙节点时,x对y的值有贡献。 差分前缀和,y的权值等于dfs中[1,l[y]]的区间和。 单点修改:add(l[x],v),add(r[x]+1,-v); 5.子树修改,单点查询 ...
所有我们可以求出f a i l failfail树的d f s dfsdfs序快速修改答案 区间修改使用树状数组差分 #include <bits/stdc++.h> using namespace std; const int maxn = 1e6+10; int zi[maxn][27],ed[maxn],id,ok[maxn],fail[maxn],num[maxn]; ...
更新某个点x的权值时,只会对它的⼦树产⽣影响,对x的⼦树的每个点到根的距离都加了W.那么我们⽤”刷漆”(差分前缀和),更新⼀个⼦树的权值.给L[x]加上W,给R[x]+1减去W,那么sum(1~L[k])就是k到根的路径点权和.5. 对节点X的⼦树所有节点加上⼀个值W, 查询X到Y的路径上所有点的...
其中.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。 每个方案输出完成后,输出一个空行。 注意:行末不能有多余空格。 输出方案的顺序任意,只要不重复且没有遗漏即可。 数据范围 1≤n≤91≤n≤9 输入样例: 4 输出样例: .Q...QQ...Q...Q.Q...Q.Q.. 2. 思路分析...
因只涉及到子树的修改,考虑求出该树的DFS序后用BIT或线段树维护.因转化后只涉及区间修改和单点查询,可用差分和BIT维护. 对操作①,可用两棵BIT分别维护原树奇数、偶数深度的节点. 代码I const int MAXN = 2e5 + 5, MAXM = MAXN << 1; namespace DFSOrderFenwickTree { int n; int a[MAXN]; int ...