
树链剖分
文章平均质量分 78
neither_nor
这个作者很懒,什么都没留下…
展开
-
BZOJ3626 [LNOI2014]LCA
链剖,由于询问是询问一段区间内的所以我们建主席树,造两颗主席树,一个维护点的个数,一个维护点的深度和,对于每个点x,往根走,每走一条轻边到达轻边的父亲结点f,就在主席树上给f的点个数+1,深度和+f的深度(默认刚开始是走了一条轻边到达点x的)查询的时候每走一条轻边到达一条重链上的结点x,求出重链上x和x以下有多少个点,再减去从来那条轻边底下来的点的个数,剩下这些点和询问点的lca都是x,用点的原创 2016-07-02 13:54:44 · 524 阅读 · 0 评论 -
BZOJ3221 [Codechef FEB13] Obserbing the tree树上询问
闲来无事水一发毒瘤题链剖+主席树即可区间加一个等差数列标记合并的时候把首项和公差都加起来就好了因为区间修改所以要标记永久化,除了标记以外还要记录子树内因更改所增加的和#include#include#include#include#include#include#include#include#include#include#include#include#原创 2016-06-17 14:47:25 · 980 阅读 · 0 评论 -
BZOJ4704 旅行
不知为何每次一看到树链第k个相关的问题就一副这道题我之前做过的感觉,然后又找不到这题-_-这题的话,对于第i年的询问,相当于有效的修改操作是到第i年为止的所有修改操作减去到第l年为止的所有修改操作,链剖加主席树维护一下修改操作然后用链剖在树上爬就行了……比较麻烦,代码写的很丑-_-#include#include#include#include#include#include#原创 2016-09-14 16:06:18 · 849 阅读 · 0 评论 -
BZOJ4712 洪水
永恒的一氧化碳大爷在讨论版里发了个单log的做法,还没来得及看……先写个链剖再说考虑没有修改的情况,我们可以树DP,f[x]表示把x的子树截断的最小代价,v[x]表示截断每个点的代价,然后我们求出每个点的s[x],代表x的所有儿子节点的f之和,f[x]就等于min(v[x],s[x])考虑修改,一次修改操作后,v[x]会增加,f[x]可能增加,可能不变,如果f[x]增加了d,那么从x到原创 2016-11-07 10:22:16 · 1508 阅读 · 0 评论 -
BZOJ4719 [Noip2016]天天爱跑步
考虑链上做法,发现就是把每个路径拆成一次加入和一次删除,然后从前往后扫,走一步所有路径经过当前点的时间就要么加一,要么减一,且要么是一直加一,要么是一直减一,可以用两个数组和指针来维护整体加减用链剖把一个区间转换成O(log n)个区间,即可在树上做#include#include#include#include#include#include#include#inclu原创 2016-11-22 14:22:07 · 1630 阅读 · 0 评论 -
BZOJ3999 [TJOI2015]旅游
水题……链剖然后维护区间最大值,最小值,和区间从左往右走的答案,还有从右往左走的答案即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define原创 2016-12-29 19:21:10 · 1042 阅读 · 0 评论 -
BZOJ4811 [Ynoi2017]由乃的OJ
显然用LCT维护一下经过一条链之后每一位原来是1会变成什么原来是0会变成什么即可这样的话LCT复杂度是n log n * k的,链剖是n log^2 n * k的,都过不了考虑把这个k给去掉,我们直接开两个unsigned long long,v0和v1,v0的每一位代表这一位原来是0的话经过这条链会变成什么,v1的每一位代表这一位原来是1的话经过这条链会变成什么那么考虑信息的合并,假原创 2017-04-07 15:04:09 · 1529 阅读 · 2 评论