显然可以将一段数字的和转化为前缀和的关系
题目中给出的s,t,v 其实就是sum[t]-sum[s-1]=v
我们可以选择维护一棵树,但这样时间复杂度绝对会炸上天
所以我们想到要压缩路径,那么正解就是:
带 权 并 查 集 !
众所周知并查集其实是一棵树,如果我们在并查集的基础上同时维护点到祖先的关系,那就是带权并查集了
我们可以在维护f[i]的同时维护p[i],它表示点到祖先的距离(在本题中是前缀和差)
1.假如a,b拥有同一个祖先(a<b)
那么a到b的距离就是p[a]-p[b]
从向量的角度来想就是AO-BO=AB (这样是不是更容易理解^-^)
如果x!=p[a]-p[b] 那么这个商人就做假账了
太baby辣!!!
1.如果a和b的祖先分别是fa和fb
那么我们使
f[fa]=f[fb]
p[fa]=p[a]-x-p[b] // 向量理解法:AO1-AB-BO2=O2O1 (这么理解太方便了hhh)
那么我们的主函数就写完了
find(x) 也要稍微改一下,当然不是我偷懒这里不写,我只是想给你一个自己思考的机会(其实就是我懒)