对节点X到Y的最短路上所有点权都加一个数W, 查询某个点的权值 解: 这个操作等价于 a. 对X到根节点路径上所有点权加W b. 对Y到根节点路径上所有点权加W c. 对LCA(x, y)到根节点路径上所有点权值减W d. 对LCA(x,y)的父节点 parent(LCA(x, y))到根节点路径上所有权值减W 于是要...
LOJ146DFS 序 3,树上差分 1 LOJ146 这道题可以说是真的板子题啦 恩一看就想到了树链剖分,于是乎很快码出了代码 Code1: View Code 正常情况的话就结束了吧 但是!!(毒瘤啊)我们发现T了一个点,于是乎我用尽了各种优化手段,不过都无济于事,想来是算法上该改进一波了,偷瞄了巨佬的代码发现可以用LCA和树状...
2 x,询问 点子树的点权和,到根的路径的点权和。 对于第一种 子树点权和 的计算类似于前一题。对于第二种 点到根的路径的点权和,可以利用差分数组进行计算。 const int N = 2e5 + 100; int l[N],r[N]; vector<int> e[N]; int tot; int a[N]; template<class T> struct BIT { T c[N...
(DFS序&树上差分&线段树动态开点:区间修改单点查询) Description 给您一颗树,每个节点有个初始值。 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x。 2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点。 Input 第一行有两个整数N,Q(1 ≤N≤ ...
也就是说在一棵子树上的DFS序,他们一定是连续的,那么我们可以做树上的差分,这里可以保留一下,稍后填坑。 一、什么是时间戳: 时间戳我们有两个标记第一个是第一次访问的时候记录一下,然后是在最后一次访问时再标记一下。 二、时间戳的性质: 我们可以直接通过时间戳来判断一个节点是否是另一个节点的子节点。
所以问题转化为:查询点x到根节点的链上的所有节点权值和。 修改节点x权值,当且仅当y是x的子孙节点时,x对y的值有贡献。 差分前缀和,y的权值等于dfs中[1,l[y]]的区间和。 单点修改:add(l[x],v),add(r[x]+1,-v); 5.子树修改,单点查询 ...
经典的二维偏序问题,只不过从前缀询问变成了两个区间的询问,这可以通过把一组询问 (l,r,L,R) 差分成 (r,R),(l−1,L−1)(+1贡献)以及 (l−1,R),(r,L−1) (贡献为-1),按照第一维排序,第二维用树状数组/线段树查询,或者似乎可以直接用树套树之类的东西(每次加点看成在二维平面上加点 (i...
更新某个点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. 思路分析...
• 建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。 • 对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。 • 注意新的问题为 ±1 RMQ,即相邻两点的深度差一定为 1。