题目大意 有一棵有\(n\)(\(n\leq5*10^4\))个点的树,\(q\)(\(q\leq5*10^4\))次询问,每次给出\(l,r,x\)表示询问所有编号在\([l,r]\)的点与点\(x\)的LCA的深度之和 题解 将\([l,r]\)里每个点和该点的所有祖先点权+1后,查询点\(x\)和它的祖先的点权和就行了 可持久化线段树维护 代码 #include<algorithm> #include<cmath> #include<cstdio> #includ…
P4211 [LNOI2014]LCA 链接 分析: 首先一种比较有趣的转化是,将所有点到1的路径上都+1,然后z到1的路径上的和,就是所有答案的deep的和. 对于多次询问,要么考虑有把询问离线,省去每次询问的复杂度,多个一起处理,要么做到优化掉查询. 这里发现求deep和的过程不能在省了,于是可以差分询问,枚举右端点,然后查询所有1到这个点的和. 而第一步的操作可以树链剖分完成.(并且查询的是一个区间,这也保证了这样做可行) 复杂度$O(nlog^2n)$ 代码: #include<cstd…
P4211 [LNOI2014]LCA 链接 loj luogu 思路 多次询问\(\sum\limits_{l \leq i \leq r}dep[LCA(i,z)]\) 可以转化成l到r上的点到根的路径+1 最后求一下1到z的路径和就是所求 区间\([l,r]\)是可以差分的 离线直接求就行了. 树剖常数小,但还是比LCT多个log 我的LCT好慢啊 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] usin…
[LNOI2014]LCA 题意 给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\) 一直想启发式合并... 关于LCA的深度,有一个转换. 比如询问\((x,y)\)的\(lca\)深度,可以把\(x\)到跟每个点染色+1,然后查询\(y\)到根的权值. 这个题离线进行差分,每次加一个点染色求前缀询问即可. Code: #include <cstdio> #include <cctype&…
题目:https://www.luogu.org/problemnew/solution/P4211 相当难的一道题,其思想难以用言语表达透彻. 对于每个查询,区间[L,R]中的每个点与z的lca肯定出现在z到根节点的路径上,则路径上的点会对结果产生贡献.那么可以对每个lca向根节点边走边给路径上的每个点贡献+1,求和后的结果就是该查询的答案.当然朴素地做肯定是不行地,可以用线段树维护每个点到根节点上的点贡献之和. 那么每次统计的话,等于将nloglog的复杂度重复q次,也不行.然而每次查询的区…
前言: 这题感觉还是很有意思.离线思路很奇妙.可能和二次离线有那么一点点相似?当然我不会二次离线我就不云了. 解析: 题目十分清真. 求一段连续区间内的所有点和某个给出的点的Lca的深度和. 首先可以转化一步. 我们可以只考虑一个询问.那么当前询问的答案可以转化为:将区间[l,r]中的每一个点到根节点的路径上的点的点权都加一.然后统计给出点z到根节点的路径上的点权之和即可. 可以使用树剖线段树搞定. 这个转化正确性显然. 但是,当考虑到多次询问时,就有点不对劲.因为两个询问如果一起计算贡献,就会…
我去这道题的Luogu评级是假的吧,这都算黑题. 我们首先考虑把操作离线不强制在线的题目离线一下一般都要方便些 考虑差分,我们用\(f(x)\)表示\([1,x]\)之间的点与\(z\)的答案,那么显然\(f(r)-f(l-1)\)即为每一次的答案. 考虑烦人的LCA,我们难以直接处理除非你会快速地一次求出一堆点的LCA 然后我们考虑从LCA的性质入手,考虑我们最初始的方法求LCA:暴力向上跳. 我们在最初始时对于一个点在它向上到根的路径上都打上标记,然后对于另一个店也沿着它向上到根的路径寻找,…
正解:树剖+线段树 解题报告: 传送门$QwQ$ 看到$dep[lca]$啥的就想到之前托腮腮$CSP$模拟$D1T3$的那个套路,,, 然后试下这个想法,于是$dep[lca(x,y)]=\sum_{i=1}^{\infty}[i\leq dep[lca(x,y)]]$,就可以是,从$x$到根全部加一然后查询$y$到根的权值和. 现在变成$\sum_{i=l}^r dep[lca(i,x)]$,那就$l$到$r$到根全加一然后查询$x$到根的权值和. 显然考虑差分呗?就$1$到$r$全加一的权…
[BZOJ3626][LNOI2014]LCA Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)].(即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和) Input 第一行2个整数n q.接下来n-1行,分别表示点1到点n-1的父节点编号.接…
[BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, Q≤50000 分析 对于一个点i,我们把i到根节点的路径全部标记+1,然后从z往上找,第一个碰到的标记不为0的节点就是lca(z,i).而i的深度恰好就是z到根节点路径上的标记和.显然这样的标记是可以叠加的,对于区间[l,r],我们把编号在[l,r]内的节点到根的路径都标记+1,那么答案就在z到根…