标签:最大 font 别人 方式 线段 codeforce strong for 后缀
题解:
一道优秀的题目
有几种做法:
1.维护后缀和
刚开始我想的是维护前缀和
然后用$sum[x]-sum[y]>=dep[x]-dep[y]$来做
但是这样子树赋值为0这个操作就很难进行了
因为你查找的是链上最小值,所以不改子树上面的节点是做不了的
那我们换一种方式,单点改,查询区间最大后缀和
其实这个东西就是动态dp。。。
$$f(v)=max(f(v)-1,0)+v[v]$$
2.操作分块
分块这个东西有的时候的确简单巧妙。。
但一般我也不会去想分块。。
这个是看了别人题解的。。
我们以每$\sqrt{n}$个元素分一组
对块内的操作,我们等待$\sqrt{n}$都做完了再把这$\sqrt{n}$个操作加入树中
对于当前的询问,我们只需要树内的$\sqrt{n}$个节点的信息就可以了
我们可以建立虚树维护
本来打算学树上分块的。。。但发现这东西并没有啥用
会线段树合并/dsu on tree/树上莫队 应该不会也没啥关系
像这种利用虚树的题目还是比较多的
标签:最大 font 别人 方式 线段 codeforce strong for 后缀
原文地址:https://www.cnblogs.com/yinwuxiao/p/10124276.html