随笔分类 -  树——树链剖分

摘要:题面 "传送门" 题解 先考虑$k=1$的情况,我们可以离线处理,从小到大对于每一个$i$,令$1$到$i$的路径上每个节点权值增加$1$,然后对于所有$x=i$的询问查一下$y$到根节点的路径和就是了 那么$k\neq 1$的情况该怎么办呢?我们来考虑一下令$1$到$i$的路径上每个节点权值加$1 阅读全文
posted @ 2019-04-21 15:36 bztMinamoto 阅读(280) 评论(0) 推荐(0)
摘要:"传送门" $Maximum\ Remaining$ 对于两个数$a,b$,如果$a=b$没贡献,所以不妨假设$a define R register define fp(i,a,b) for(R int i=(a),I=(b)+1;iI; i) define go(u) for(int i=hea 阅读全文
posted @ 2019-04-15 17:45 bztMinamoto 阅读(283) 评论(2) 推荐(0)
摘要:题面 "传送门" 题解 后缀平衡树是个啥啊我不会啊…… 那么我们来考虑一下$SAM$的做法好了 不难发现它的本义是要我们维护一棵$trie$树,并求出$trie$树上每一个节点到根的这段串的不同子串个数,而显然一个串的不同子串个数就是它的$SAM$上每一个节点的$len[p] len[fa[p]]$ 阅读全文
posted @ 2019-03-23 10:56 bztMinamoto 阅读(286) 评论(0) 推荐(0)
摘要:题面 "传送门" 题解 ~~代码不就百来行么也不算很长丫~~ ~~虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解~~ 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边进行分治,即每次选出一条“子树中点的个数的最大值最小”的边,处理所有经过这条边的 阅读全文
posted @ 2019-03-19 16:21 bztMinamoto 阅读(308) 评论(0) 推荐(0)
摘要:题面 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾。 例如对于上图中的树,它的删除序列为:2 4 3 1 5 现在给出一棵$n$个节点的树,有$m$次操作: $up$ $v$:将$v$号节点的编号变为当前 阅读全文
posted @ 2019-03-15 15:20 bztMinamoto 阅读(662) 评论(0) 推荐(0)
摘要:题面 题解 首先,点变黑的过程是不可逆的,~~黑化了就再也洗不白了~~ 其次,对于$v$的祖先$rt$,$rt$能用来更新答案当且仅当$sz_{rt} sz_{x}$,其中$sz$表示子树中黑点的个数,$x$表示$rt$走到$v$的路径上的第二个节点 每一次染黑一个新的点$u$之后,我们要让它所有祖 阅读全文
posted @ 2019-02-24 20:59 bztMinamoto 阅读(253) 评论(0) 推荐(2)
摘要:题面 题解 $std$爆栈了→_→ 我们先考虑一个简化的问题,如果只有加边的情况下如何动态维护直径 合并两棵树时,设$a,b$为$A$的直径的两个端点,$c,d$为$B$的直径的两个端点,那么新的树的直径一定是$ab,ac,ad,bc,bd,cd$中的一个 证明:新树的直径一定是原树的直径或一条经过 阅读全文
posted @ 2019-01-28 15:11 bztMinamoto 阅读(381) 评论(0) 推荐(2)
摘要:题面 题解 又一道全场切的题目我连题目都没看懂……细节真多…… 先考虑怎么维护仙人掌。在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分。如果一条边不是生成树上的边,它肯定会和树上$u,v$这条路径构成一个环,然后对于每条树边记录一下这条树边被覆盖过没有 阅读全文
posted @ 2019-01-05 11:07 bztMinamoto 阅读(370) 评论(0) 推荐(0)
摘要:"传送门" 一个中午啊…… 本来打算用仙人掌搞的,后来发现直接基环树就可以了,把多出来的那条边单独记录为$(dx,dy,dw)$,剩下的树剖 然后最短路径要么直接树上跑,要么经过多出来的边,分别讨论就好了 因为这里的树剖只有单点修改和区间查询,于是可以用树状数组 阅读全文
posted @ 2018-12-10 13:24 bztMinamoto 阅读(302) 评论(0) 推荐(0)
摘要:"洛谷题面" 圆方树还真是个神奇的玩意儿…… 我们先考虑询问,对一个点双来说,经过这个点双的时候能走到的最小值肯定是这个点双内的最小值,那么只要对于每个点双把它的权值设成它里面所有点的最小值,那么就可以在建出广义圆方树之后用树链剖分求出路径最小值了 然而这里有询问,一个想法是对每个点双开一个mult 阅读全文
posted @ 2018-11-29 15:08 bztMinamoto 阅读(223) 评论(0) 推荐(0)
摘要:传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然后再取反 单点修改的时候忘记pushdown结果调了好久…… 阅读全文
posted @ 2018-10-16 17:45 bztMinamoto 阅读(156) 评论(0) 推荐(0)
摘要:传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$mid$ 然后考虑怎么判断是否所有边都经过某一个点。我们可以用树状数组+树上差分来维护,把每一条边的两 阅读全文
posted @ 2018-10-16 15:51 bztMinamoto 阅读(198) 评论(0) 推荐(0)
摘要:传送门 树剖板子…… 一个路径加和,线段树上打标记。一个子树询问,dfs的时候记录一下子树的区间就行 阅读全文
posted @ 2018-10-16 14:34 bztMinamoto 阅读(194) 评论(0) 推荐(0)
摘要:传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树剖求一下LCA 阅读全文
posted @ 2018-10-16 13:53 bztMinamoto 阅读(231) 评论(0) 推荐(0)
摘要:传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 1.线段树记两个标记,一个区间覆盖,一个区间加和 2.区间覆盖的标记更新后要把区间加和的标记删除, 阅读全文
posted @ 2018-10-15 22:19 bztMinamoto 阅读(249) 评论(0) 推荐(0)
摘要:传送门 不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献 于是这就变成了一个路径修改 那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做路径修改,然后再把权值取回来就行了 几个注意点: 1.记得路径修改的时候$LCA$是不需要改的 2. 阅读全文
posted @ 2018-10-15 21:18 bztMinamoto 阅读(339) 评论(0) 推荐(1)
摘要:传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 阅读全文
posted @ 2018-10-15 20:42 bztMinamoto 阅读(225) 评论(0) 推荐(0)
摘要:传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 阅读全文
posted @ 2018-10-15 18:53 bztMinamoto 阅读(170) 评论(0) 推荐(0)
摘要:传送门 我们把每一条路径拆成$u->lca$和$lca->v$的路径 先考虑$u->lca$,如果这条路径会对路径上的某一个点产生贡献,那么满足$dep[u]-dep[x]=w[x],dep[u]=dep[x]+w[x]$,注意到$dep[x]+w[x]$是一个定值,所以我们只要去找它的子树里有多少 阅读全文
posted @ 2018-08-31 09:00 bztMinamoto 阅读(273) 评论(0) 推荐(0)
摘要:题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信 阅读全文
posted @ 2018-08-30 21:10 bztMinamoto 阅读(296) 评论(0) 推荐(0)

Live2D