树链剖分
zxyoi_dreamer
退役了退役了爬了爬了,搞个锤子算法竞赛,不如好好享受大学生活。
展开
-
【LOJ6184】无心行挽(虚树)(树形DP)(树链剖分)(ST表)
传送门题解:虚树好题,后续的处理其实也可以用倍增,不过树剖常数那么小直接上树剖+ST表完全没有压力。首先看到题目这个形式大概就是要用虚树的了。求的是距离所有关键点的最小值的最大值。答案点有三种情况,在虚树节点上,在虚树缩掉的边的子树中,在虚树上的点的无关键点子树中。第一种树形DP,第二种树剖+DFS序+ST表,第三种BFS序+ST表。非常好写代码:#include<bi...原创 2019-11-04 21:34:49 · 1415 阅读 · 0 评论 -
【校内模拟】剪刀运送(树链剖分)(树状数组)(链加维护带权重心)
简要题意:给你一棵树。请你支持两个操作,链上加所有点权值+1,选择一个点并最小化它到所有点的距离乘上那个点的权值之和。每次修改后回答一次。保证树的形态随机。题解:std是一个需要树的形态随机的垃圾做法,丢掉不管。我们来考虑树的形态任意怎么做,同时我们把链上加权值的范围放宽到任意正数。首先发现要求的是带权重心。链加的时候,一个点作为带权重心的时候的权值可以用树剖+BIT或者直接一个L...原创 2019-10-31 15:21:54 · 331 阅读 · 0 评论 -
【SNOI2019】网络(我只会口胡不想实现)(长链剖分)(树形DP)
传送门口胡题解:我觉得来做这道题的同学有必要认识一下出题人lca,【十二省联考2019 希望】也是这位毒瘤神仙出的。。。那道题标程20K。。。首先注意到答案最后选择的是一个包含uuu且直径不超过ddd的极大连通块。注意到询问只有10个,而且没有修改,也就是说我们可以考虑处理出以每个点或每条边为连通块中心的答案,然后暴力枚举中心即可。那么考虑怎么快速处理出每个点为中心的答案。注意到这其...原创 2019-10-17 18:43:31 · 821 阅读 · 0 评论 -
【GXOI/GZOI2019】旧词(树链剖分)(树状数组)
传送门题解:深度的kkk次方只是一个标志而已,把LCALCALCA深度的kkk次方换成LCALCALCA的其他什么属性求和也是可以做的。考虑枚举询问点到根的路径上每个点,考虑它被算多少次,实际上就是siz[i]−siz[pre]siz[i]-siz[pre]siz[i]−siz[pre]。其中sizsizsiz是子树中已经激活的点的数量,preprepre是路径上上一个点。直接HLD,...原创 2019-10-16 15:54:27 · 128 阅读 · 0 评论 -
【ZJOI2019】Minimax(动态DP)(链分治)
传送门题解:当时做ZJOI的时候Day1就这一道不会,只写了70pts暴力(当时连DDP都不知道是什么东西)。首先和ZJOI2019 D1T1一样的转化思想,并不好计算稳定度为kkk的集合,考虑计算稳定度不超过kkk的。首先我们知道初始状态有一条唯一的答案链。链上任何一个节点的权值改变都会导致答案改变,并且链上所有点的权值在初始情况下都等于答案。对于深度奇偶性分类讨论,然后补集转化就...原创 2019-08-28 11:35:16 · 220 阅读 · 0 评论 -
【十二省联考2019】希望(长链剖分)(树形DP)(线性求逆元)(可回退化)
传送门近年来std最反人类的题。然而这是因为lca不知道在想什么专门写了个内存池管理加上大量注释和空行, std上900行也不是不能理解。选手命要没了然而如果真的要喷这道题的话...原创 2019-09-05 20:42:25 · 351 阅读 · 0 评论 -
【BZOJ3306】树(树剖换根)(ZKW线段树)
传送门老年选手复习树剖换根,无题解。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char#define cs constnamespace IO{ static cs int Rlen=1<<22|1; static char buf...原创 2019-09-09 10:25:37 · 116 阅读 · 0 评论 -
【HDU5566】Clarke and room(AC自动机)(树链剖分)(线段树)
传送门题解:在线也好离线也好,反正AC自动机只建在有询问的线段树节点上就行了。由于树链剖分形态的特殊性,可能很多线段树节点上都没有询问(是两条链标号的并),建出来就是浪费时间。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char #define cs...原创 2019-09-23 18:56:31 · 187 阅读 · 0 评论 -
【UOJ#284】快乐游戏鸡(长链剖分)(单调栈)
传送门我TM就随手一写。UOJ速度榜rk4的同时,加上读优之后UOJ码长榜第二,把fread优化去掉后就成码长榜第一了???某种意义上从侧面证明了这个做法的优越性题解:考虑什么时候能够从sss走到ttt,当且仅当死亡次数已经达到了路径上的www最大值,这个可以倍增求一下。也就是说在死亡次数达到maxw\max wmaxw之前,我们只能一直死,那么显然我们希望能够早死早超生。维护一...原创 2019-09-29 18:02:44 · 457 阅读 · 0 评论 -
【洛谷P4482】[BJWC2018]Border 的四种求法(SAM)(线段树)(链分治)
传送门题解:思博题一写就是一下午。。。首先区间border这个玩意是没有办法直接做的。我还没有听说过有什么字符串理论是针对区间border的,我目前知道所有字符串border理论全部是针对全串的,如果您知道区间border的相关理论,欢迎打脸告知博主。那么实际上转化成字符串术语,我们询问的是满足i−l+1≤lcs(i,r),l≤i<ri-l+1\leq lcs(i,r),l\le...原创 2019-10-08 16:18:08 · 322 阅读 · 0 评论 -
【LOJ574】「LibreOJ NOI Round #2」黄金矿工(模拟费用流)(链分治)(线段树)
传送门题解:很容易看出这道题的费用流模型,由于是在线修改,所以显然我们要支持动态维护流量和费用。其实模拟费用流最容易犯的错误就是没有考虑退流我就奇了怪了这题单点修改区间max,怎么没人写ZKW线段树维护流量还是很简单的,显然我们只需要维护每个点向下流了多少,也就是它能向上反悔多少(显然本身能够向下流的就是无穷大),直接树链剖分支持一下链加即可。考虑简化一下问题,由于一个矿工和一块黄金...原创 2019-10-11 19:22:00 · 798 阅读 · 1 评论 -
【SDOI2017】【BZOJ4911】【LOJ2269】切树游戏(FWT)(链分治)(线段树)(矩阵乘法)
LOJ传送门BZOJ传送门洛谷上有某位毒瘤上传了专门卡树剖的数据,写完了才看见,以后会重新把全局平衡二叉树的题解写在另一篇博客里面。题解:首先如果没有修改这道题码长最多也就2K左右。树上动态DP,喜闻乐见写链分治或者全局平衡二叉树。我写的链分治。然后就是常见的统计轻儿子,线段树合并重儿子的操作,注意标记的合并,可以去看猫锟的blog代码:#include<bits/std...原创 2019-08-07 21:49:41 · 240 阅读 · 0 评论 -
【YNOI2017】【BZOJ4811】【洛谷P3631】由乃的OJ / 睡觉困难综合征(树链剖分)(线段树)(贪心)
BZOJ传送门洛谷传送门代码:#include<bits/stdc++.h>#define re register#define gc get_char#define cs consttypedef unsigned long long ull;namespace IO{ inline char get_char(){ static cs int Rlen...原创 2019-04-17 11:29:22 · 345 阅读 · 0 评论 -
2018.10.19【NOIP练习】树链剖分(换根树剖)
传送门解析:其实说是换根,并不会真正的换根,不然怎么维护原来轻重链剖分的代码:#include&lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define re register#define gc getchar#define pc putchar#define cs constinline ...原创 2018-10-19 14:01:52 · 847 阅读 · 0 评论 -
2018.11.05【校内模拟】树(长链剖分)(复杂度多一个log(过不了)的点分治)
传送门解析:OJ又双叒叕卡栈空间。。。思路:首先看到距离不超过kkk很容易想到点分治。每次处理出子树中所有点到分治中心的距离,然后处理一个二进制前缀和,双指针扫一遍数列,就可以愉快的做完这道题?点分治复杂度O(nlognlog∣A∣)O(nlognlog|A|)O(nlognlog∣A∣),卡在2e82e82e8的极限,本来递归算法常数就大,卡不动了。。。但是愿意卡常数的话考场上还...原创 2018-11-05 08:24:13 · 181 阅读 · 0 评论 -
2018.11.05【校内模拟】相交(DFS序)(树状数组)(用来对拍的树链剖分)
传送门解析:首先怎么判断树上两个路径相交,其中一条路径的LCALCALCA必然在另外一条路径上。所以问题变成了,新增一条路径,询问有多少其他路径的LCALCALCA在它上面,询问它的LCALCALCA在多少其他路径上面。注意处理LCALCALCA重合的情况。这个显然的做法就是维护两个线段树,然后树链剖分维护路径加,单点求值和单点加,路径求值,注意“和”字分开的两个部分不能混为一谈。但是...原创 2018-11-05 15:54:33 · 173 阅读 · 0 评论 -
2018.11.05【NOIP2015】【洛谷2680】【UOJ#150】运输计划(二分答案+DFS序+树上差分)或(复杂度并不对(也不能过)的树链剖分)
洛谷传送门UOJ传送门解析:UOJ上的数据很强,复杂度不对过不了的,但是LCALCALCA如果是用倍增求的话也过不了(已经加了上界优化)。。。毕竟树剖常数小,复杂度还不满。。。思路:首先,不要试图化边为点,每条边的信息可以存在它所指向的儿子中。解法1:UOJ上不能过的树链剖分其实我们只需要考虑断掉哪些边就行了,显然断掉最长路径上以外的边是没有作用的,所以我们只需要考虑枚举断掉最长路...原创 2018-11-05 21:45:47 · 218 阅读 · 0 评论 -
2019.01.10【BZOJ4543】【POI2014】Hotel加强版(长链剖分)
传送门解析:长链剖分裸题。我们考虑如果树上三个点距离相等,那么必然存在一个点uuu,它到这三个点的距离全部相等。那么分类讨论两种情况,三个点在uuu节点的不同子树内部,这个很好统计,随手就转移了。那么还有一个情况,其中一个节点在子树外部。换句话说,就是在uuu的某一个祖先的其他子树当中。这个不好直接在uuu处统计啊。换一个思路,我们考虑在这个上级祖先处统计这个三元组。我们需要对...原创 2019-01-10 21:15:03 · 172 阅读 · 0 评论 -
2019.01.20【TJOI2015】【BZOJ3999】【洛谷P3976】旅游(树链剖分)(线段树)
BZOJ传送门洛谷传送门解析:这个LCT和链剖都能做的,不过链剖空间常数大,而LCT空间常数小而时间常数大。思路:考虑重链剖分,DFSDFSDFS优先重儿子构造出DFS序,建立线段树,同时维护由DFS序大的向DFS序小的走的答案,和DFS序小的向DFS序大的走的答案。还要维护最大值和最小值。剩下的就是无脑跳轻重链了。代码:#include<bits/stdc++.h>...原创 2019-01-20 14:29:02 · 210 阅读 · 0 评论 -
2018.03.19【SPOJ-QTREE】Query on a tree(轻重链剖分)(线段树)(DFS序)
传送门过于基础不想写题解,写LCT写久了忘了树剖怎么写了来复习一下。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char#define cs constnamespace IO{ inline char get_char(){ static c...原创 2019-03-19 20:44:04 · 161 阅读 · 0 评论 -
2019.03.21【SPOJ-QTREE3】Query on a tree again!(轻重链剖分)
传送门解析:树链剖分裸题啊。。。我们每个重链开一个set按照深度维护一下黑点,每次查找只需要跳重链的同时看一下链上最浅的黑点在不在vvv上面就行了。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char#define cs constnamespa...原创 2019-03-21 19:06:32 · 122 阅读 · 0 评论 -
【BZOJ4712】洪水(动态DP)(链分治)(线段树)
题目描述给出一棵树,点有点权。多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值。输入输入文件第一行包含一个数n,表示树的大小。接下来一行包含n个数,表示第i个点的权值。接下来n-1行每行包含两个数fr,to。表示书中有一条边(fr,to)。接下来一行一个整数,表示操作的个数。接下来m行每行表示...原创 2019-04-10 14:35:40 · 264 阅读 · 0 评论 -
【十二省联考2019】【LOJ3052】【洛谷P5290】【BZOJ5499】春节十二响(贪心)(树链剖分)(线段树)
LOJ传送门洛谷传送门BZOJ传送门解析;来给大家看一个看似O(nlog2n)O(n\log ^2n)O(nlog2n)实际上是O(nlogn)O(n\log n)O(nlogn)大常数的菜鸡做法。考场上yyyyyy出来的。来看一个正确性显然的贪心:首先我们在当前没有选择的点中选出代价最大的点,将它的掌控范围,即它到根的链和它的子树,全部ban掉,即本轮禁选。将它的权值加入答案...原创 2019-04-10 16:06:31 · 335 阅读 · 0 评论 -
2019.04.02【CodeForces487】E. Tourists(圆方树)(树链剖分)(线段树)
传送门解析:我们发现题目中简单路径这个条件其实就是将点双缩点后,重构树上路径经过的所有点双里面的点。于是构建广义圆方树。这道题还是为了方便处理,将所有割边改造为方点。按照套路,所有方点维护亲儿子的信息,直接开一个multiset就行了。显然我们需要询问路径上最小值,上树剖和线段树维护,然后在询问的时候特判路径LCA为方点的情况。代码有点长,但是没什么细节,很好写。代码:#inc...原创 2019-04-02 09:57:00 · 179 阅读 · 0 评论 -
2018.09.30【ZJOI2008】【BZOJ1036】【洛谷P2590】树的统计(树链剖分)(线段树)
BZOJ传送门洛谷传送门解析:好久没写过这么长的题了。。。(虽然说本来可以几个函数封装在一起的)这大概是我碰树链剖分的第一道题吧,上一次写这道题是很久之前了,现在开了博客再写一遍。深刻理解树链剖分后再回头看,发现这真是一道简单的好题。想写长链剖分的童鞋请自重,毕竟那复杂度是要看运气的。这道题一般的做法是轻重链剖分加线段树。(当然还有树分块) 树分块的题解我会在以后更新,复杂度没有轻...原创 2018-09-30 17:56:45 · 136 阅读 · 0 评论