![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树剖
HT008_123
家人们点点关注叭
展开
-
[2021 HDU多校] HDU 6962 I love tree
题目描述:给定一棵树,然后有两个操作。第一个操作从U,V这个路径上的点权值依次加上路径次序的平方。第二个操作是查询点U的权值和。题目分析:首先可以树剖把路径分为logn段。对于dfn从[h,t]这段,可以维护一个二次函数(x−h)2(x-h)^2(x−h)2展开后得到x2+h2−2∗x∗hx^2+h^2-2*x*hx2+h2−2∗x∗h分别用三个线段树维护每个项的和就可以了时间复杂度O(n(logn)2)O(n(logn)^2)O(n(logn)2)题目链接:HDU 6962AC代码原创 2021-07-23 16:41:16 · 473 阅读 · 2 评论 -
[SDOI 2011] 染色
题目描述:给出N个点的初始颜色 定义一条路径上的颜色数量为不同颜色的路径段数 如110110 为4种颜色 给出M个操作 Q u v:查询 u v 路径上的颜色数量 C u v x :将 u v 路径上的点全部染成 x题目分析:树剖+线段树 在合并左右儿子信息的时候 我们只需判断一下左儿子的右节点颜色和右儿子的左节点颜色即可得到父节点信息 注意,在进行树剖查询时也要注...原创 2018-03-19 21:04:12 · 162 阅读 · 0 评论 -
[LNOI2014] LCA
题目描述:给出一颗树 根节点为 1 给出 M 个 询问 l r z 求∑ri=ldep[lca[i,z]]∑i=lrdep[lca[i,z]]\sum_{i=l}^{r}dep[lca[i,z]] dep为距离根节点的距离+1题目分析:暴力分一点不给差评! 思路来自黄学长 首先 考虑一种暴力 我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第...原创 2018-04-01 08:03:37 · 264 阅读 · 0 评论 -
[AHOI2008] 聚会
题目描述:qwq。题目分析:求出3个点两两的LCA 有两个是相同的选另一个作为聚会地点 然后算距离 树剖LCA快的飞起qwq题目链接:BZOJ 1832Ac 代码:#include <cstdio>#include <iostream>#include <algorithm>#include <cs...原创 2018-04-09 18:48:15 · 234 阅读 · 0 评论 -
(SPOJ)QTREE - Query on a tree 系列 题解
1:QTREE 1简单描述: 多组数据,维护树上边权,资瓷询问路径最大边权以及修改某个边权. 分析: 简单的树链剖分,转化维护边权为点权,注意初始化#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>const int inf=0...原创 2018-04-10 09:40:59 · 193 阅读 · 2 评论 -
[BJOI2018] 求和
题目描述:求∑x∈Path(u,v)deep(x)k∑x∈Path(u,v)deep(x)k\sum_{x\in Path(u,v)}deep(x)^k题目分析:注意到K比较小 树剖和倍增均可维护…题目链接:BZOJ 5293 Luogu 4427Ac 代码:树剖跑的贼慢…#include <cstdio>#include <algor...原创 2018-04-22 16:18:31 · 959 阅读 · 0 评论 -
[CTSC2008] 网络管理Network
题目描述:求树链第K大权值,带修.题目分析:如果不带修的话就是个裸的LCA+主席树惹~ 带修惹那就得写带修主席树了… 本题有很多写法 Po猪先写了二分树剖树套树… 复杂度不太科学啊… 反正过了…写了一上午… Splay的常数啊…无力吐槽… 带修主席树…还没写题目链接:Luogu 4175Ac 代码:二分树剖树套树#include <cs...原创 2018-04-23 11:17:55 · 313 阅读 · 0 评论 -
[TJOI 2015] 旅游
题目描述:树上可修改的两点间有序差值最大值…题目分析:线段树先分别维护 两个方向的差值最大值 把所有链记录下来 答案要么在一段内,要么最值分别分布在两段内 我们就用每一段的答案更新答案,再单独拿出所有的剖出的链,考虑相互影响来更新答案题目链接:Luogu 3976 COGS 1978 BZOJ 3999Ac 代码:#include <cstr...原创 2018-05-03 17:30:51 · 194 阅读 · 0 评论 -
[Luogu 4315] 月下毛景树
题目描述:QAQ…题目分析:边权转化点权,树剖+线段树,维护最大值,支持区间加和区间覆盖…题目链接:Luogu 4315Ac 代码:#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>const int ma...原创 2018-05-06 08:56:01 · 341 阅读 · 1 评论 -
[USACO18OPEN] Disruption
题目描述:qwq…题目分析:对于每条额外边x-y,可以作为原树上x-y的路径上的任意一条边删去时的答案,所以路径更新最小值即可。题目链接:BZOJ 5279 Luogu 4374Ac 代码:#include <cstdio>#include <cstring>#include <algorithm>#include &...原创 2018-05-06 11:25:39 · 255 阅读 · 0 评论 -
[SCOI 2015]情报传递
题目描述:雾。题目分析:emmmm. 看到有区间查询小于某值的个数。 直接怒打一发 树剖+树套树 经过无数次 RE MLE 以后,终于卡过去了 然而我为啥不用主席树啊TAT 智商下线(好像也没有过 线段树套个BIT快一些 emmmm题目链接:Luogu 4216 BZOJ 4448Ac 代码:本代码可在BZOJ上过,请在洛谷上酌情加空间qwq...原创 2018-03-11 14:33:02 · 439 阅读 · 0 评论 -
[SDOI 2014] 旅行
题目描述:无。题目分析:首先,如果没有宗教信仰的限制,即每个旅行者可以在沿途的任何一个城市睡觉。 那么这个问题就是一个树上路径求max&&sum的问题,树剖+线段树 但是现在加入了宗教限制。 观察一下宗教个数,为10510510^5. 假如我们开10510510^5棵线段树,分别对应每种宗教。 我们在查询的时候就可以在相对应的线段树中进行查询. 然而如果...原创 2018-02-24 07:07:22 · 311 阅读 · 1 评论 -
ZJOI[2008]树上统计
一道树剖的裸题,连区间修改都不用,只需要单点修改,区间最值,区间求和即可。 需要注意的是,此题有负数,求最大值时需要考虑。 题目传送门#include #include #define lson (o#define rson (ousing namespace std;const int maxm=310000;int deep[maxm],son[maxm],size[max原创 2018-01-06 10:04:52 · 289 阅读 · 0 评论 -
HAOI[2015]树上操作
树链剖分裸题。 需要注意的是,此题要开long long 中间变量也要开long long (坑死了) 话说自己搞到组数据,结果死活在自己电脑上RE。 后来发现是爆栈了。 下篇博客发一下本地扩栈的方法。 题目#include #include #define lson (o#define rson (o#define ll long longusing namespace原创 2018-01-06 14:15:57 · 179 阅读 · 0 评论 -
P3038 [USACO11DEC]牧草种植Grass Planting
之前我们的树剖都是处理点权问题,现在变成了边权。如何转化呢? 首先,题目强调的加权是边而不是点,所以我们必须将为边加权转化成为点加权。对于每条边,我们将其深度更大的端点加权,则区间 [l, r] 的加权(或询问)即为去掉深度最小的点,给其余点加权(或询问)。这么一听处理起来似乎很麻烦,但我们可以思考下树剖查询的过程:1)最后一次树剖查询时,当前两点 x,y 必定在同一重链上(y 的深原创 2018-01-06 15:53:28 · 261 阅读 · 0 评论 -
[算法讲解] 树链剖分
引言如果给你一串数,查询区间的和(max或min),该如何做? 线段树(树状数组) 但如果这个问题换到树上,查询 u,v 路径上的和呢? 树LCA+暴力 如果数据随机,这种方法是可以过的! 可是你觉得出题人会这么好心吗? 所以我们引出树链剖分,将这类问题转化成由线段树可以解决的问题!定义deep[i]deep[i]deep[i] 为i节点的深度(根的深度为1) son...原创 2018-01-06 08:49:12 · 251 阅读 · 0 评论 -
P2146 [NOI2015]软件包管理器
1.对于安装软件操作 首先查询根节点到查询点路径上已安装软件个数。 然后从根节点到当前节点路径插入值1 然后再查询根节点到查询点路径上已安装软件个数。 两者相减即为答案。 2.对于卸载软件操作 跟安装软件操作大致相同。只是要注意我们不能够同时安装多个相同软件软件。 所以区间修改方式略有不同。 如何维护呢? 只需要这样//每次插入时num为1,删除时为0,这样就可以做到只安原创 2018-01-06 17:00:58 · 295 阅读 · 0 评论 -
P3128 [USACO15DEC]最大流Max Flow
不要被题目迷惑! 维护一个最大值即可。 树剖+线段树。 (我刚开始维护了最小值) 维护的是点权,不是边权。。。。。 QWQ#include #include #define lson (o#define rson (ousing namespace std;const int maxm=210000;int deep[maxm],son[maxm],size[maxm],原创 2018-01-06 19:54:20 · 269 阅读 · 0 评论 -
[Luogu P3950] 部落冲突
COGS Luogu 另外值得一提的是 COGS上有这么多点 题意描述:给你有N个点的一棵树。 C u v 表示 u v之间的道路不能通行 Q u v 表示 询问 u v之间是否有不可通行的道路 U u 表示 第u个 C操作失效 写一种数据结构,支持以上三种操作。题目分析:树剖解决! 我们先进行树剖,然后维护一颗边权线段树,支持区间修改和区间查询。 每次把...原创 2018-01-20 15:11:56 · 291 阅读 · 0 评论 -
P3258 [JLOI2014]松鼠的新家
题目分析:看大家清一色都是树剖+树上差分的做法,本弱贡献一种用树剖+线段树的思路。 题意很明显 每次把ui−1−>lca(ui−1,ui)−>uiu_{i-1}->lca(u_{i-1},u_i)->u_i路径上的点权值都+1 很明显就是线段树嘛。 我们把所有的区间修改操作都搞好了以后,然后把整颗线段树都遍历一遍,求出每个点上的权值。 但问题是 中间的点每次加都多加了1(不包括第一次的原创 2018-01-20 16:20:35 · 261 阅读 · 0 评论 -
[Luogu P3398] 仓鼠找sugar
题目描述:给你一个N个点的树。 然后对于每个操作查询 u->v a->b的路径是否有相交的地方 题目分析:貌似不用分析了,直接树剖+线段树就OK。 我们先将 u->v路径上的点权值+1 然后查a->b路径上的权值和,如果相交了,那么这个和就不是0了 别忘了消除影响。AC Code:#include #include #define lson (o#defi原创 2018-01-20 17:08:43 · 288 阅读 · 0 评论 -
树剖求LCA
若不知道树剖是啥的,请参照我上篇博客。实现先对树进行树剖 如何求LCA 1:若u,v在一条重链上 那么深度小的点即为LCA 2:若二者不在一条重链上 假设deep[top[u]]>deep[top[v]] 那么我们可以令u=fa[top[u]],直到两者在一条重链上。//树剖求lca很短,只是预处理有点长int lca(int u,int v){ whil原创 2018-01-06 09:13:04 · 327 阅读 · 0 评论