IcpcCamp-day1-E
2017-02-13 22:02
162 查看
Question
求f(i)=ΣW[lca(i,j)] (i=1~n,j=1~i-1)
Tips
树链剖分+线段树(lazy)+差分思想?
Solve
考虑到每次询问为前i-1个点的贡献,所以先查询再插入进行修改。联想到LNOI的一道树链剖分题求的是g(i)=Σdep[lca(i,j)],做法是插入点时将点到根节点的路径上各点权值都+1,这样对于g(i)的询问,求的就是i点到根节点的路径上点的权值和,原因如下图
例如查询点4的时候,4到根节点所包含的各段路径长度即为各最近公共祖先的dep。同理,若讨论w[lca(i,j)],线段树每个叶子节点上记录的ans值为差分后的若干倍w’,具体实现时w’=w-w[fa],区间插入时一段连续的w’的和可按dfs序用前缀和做差来计算。
Step
1. 插入点i:
将i到根节点的区间上
1)点数+1(lazy)
2)ans值+该区间w’的和
2. 查询点i+1:
统计i+1到根节点区间上的ans值的和
Code
AC
求f(i)=ΣW[lca(i,j)] (i=1~n,j=1~i-1)
Tips
树链剖分+线段树(lazy)+差分思想?
Solve
考虑到每次询问为前i-1个点的贡献,所以先查询再插入进行修改。联想到LNOI的一道树链剖分题求的是g(i)=Σdep[lca(i,j)],做法是插入点时将点到根节点的路径上各点权值都+1,这样对于g(i)的询问,求的就是i点到根节点的路径上点的权值和,原因如下图
例如查询点4的时候,4到根节点所包含的各段路径长度即为各最近公共祖先的dep。同理,若讨论w[lca(i,j)],线段树每个叶子节点上记录的ans值为差分后的若干倍w’,具体实现时w’=w-w[fa],区间插入时一段连续的w’的和可按dfs序用前缀和做差来计算。
Step
1. 插入点i:
将i到根节点的区间上
1)点数+1(lazy)
2)ans值+该区间w’的和
2. 查询点i+1:
统计i+1到根节点区间上的ans值的和
Code
AC
相关文章推荐
- ICPCCamp 2016 Day1 ftiasch's Contest #4(All Pair Shortest Path-位运算)
- ICPCCamp 2017-Day1 E.Lowest Common Ancestor(树链剖分/lct)
- camp day1
- ICPCCamp 2016 Day 4 - SJTU Dreadnought Contest(The Road Network-区间dp)
- ICPCCamp 2017 Day 6: U of Tokyo Selection 1 - Problem A. Spanning Trees
- ICPCCamp 2016 Day 6 - Spb SU and Spb AU Contest(Greedy Game-贪心)
- ICPCCamp 2016 Day 8 - Makoto Soejima's Contest #4(String Modification-模拟)
- ICPCCamp 2016 Day 1 - A Aho-Corasick Automaton (主席树)
- ICPCCamp 2017 I Coprime Queries
- ICPCCamp 2016 Day 1 - F Data Structure You've Never Heard Of (sqrt(n))
- 2017 - ICPC - 青岛站 - day1
- ICPCCamp 2016 Day 3 - F Similar Subsequence (dp)
- 2016 icpc-camp 之旅(一)
- ICPCCamp 2016 Day3 - G Random Arighmetic (dp)
- 2016 ICPC CAMP Recording
- day1:JAVA书籍和资源搜索方法
- 【JZWinter Camp 2017】欠题小结
- Python之路,Day1 - Python基础1
- js的一些入门题目(freecodecamp)
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A