题解:
斜率优化在树上,直接暴力删线段再用栈维护复杂度显然是错的。
然后以为要用可持久化线段树维护,
后来发现我sb了
只需要在查询和修改的时候二分一下修改位置,直接在原数组上修改和记录就好了
因为我们每次只修改一个点,并且只会查询上一个版本(父亲)的单调队列,类似线段树分治的情形,
所以我们不用可持久化线段树维护。可以直接修改,回溯时只将当前的修改改回来
另外,看到有人用树分治的做法,这道题没有必要,但是思想是很好的
只考虑重心到根的链,重心一下的按深度排序后单调查询。
但是重心以上的子树在链上的查询需要二分,所以是nlog^2的
不过,这种思想很像cdq分治,先统计一段区间(重心到根)对子树的贡献(只考虑在此链上分界的情况),在递归统计。
是一个很好的树上解题思路
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define repd(i,a,b) for(int i=a;i>=b;--i)
#define rvc(i,S) for(int i=0;i<(int)S.size();++i)
#define f