随笔分类 -  dfs序

摘要:首先一般化的将下水道和塌陷看成一个东西。注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道。这个第一个访问的点显然就是正常dij过程中,该下水道第一个被取出的点。 于是在dij过程中,取出了某个点进行更新后 阅读全文
posted @ 2019-01-15 23:50 Gloid 阅读(741) 评论(0) 推荐(1)
摘要:在子树内和距离不超过k是一个二维限制,容易想到主席树,但主席树显然没法查最小值,因为不满足区间可减。kdtree和二维线段树可以干这事,但肯定会T飞。但事实上我们的问题有一个特殊性:对某个点x,查询其子树中的depth[x]~depth[x]+y和0~depth[x]+y这两种深度区间实际上是相同的 阅读全文
posted @ 2018-12-05 20:13 Gloid 阅读(359) 评论(0) 推荐(0)
摘要:对每个权值分别考虑。则只有单点加路径求和的操作。树上差分转化为求到根的路径和,子树加即可。再差分后bit即可。注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了。 阅读全文
posted @ 2018-12-02 21:52 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:容易想到用dfs序转化为序列上的问题。考虑分块,对每块排序,修改时对于整块打上标记,边界暴力重构排序数组,询问时二分答案,这样k=sqrt(nlogn)时取最优复杂度nsqrt(nlogn)logn,离跑过去还差一点。二分答案这一部分看上去很难优化,考虑重构时不那么暴力,将要修改的和不要修改的部分分 阅读全文
posted @ 2018-11-24 19:02 Gloid 阅读(203) 评论(0) 推荐(0)
摘要:考虑没有深度限制怎么做。显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log。 另一种做法是利用树上差分。对于同种颜色的点,在每个点处+1,dfs序相邻点的lca处-1,那么查询子树颜色数就只需要查询子树和了。 然后加上深度限制。考虑将点一层层加进去,利用se 阅读全文
posted @ 2018-11-15 19:54 Gloid 阅读(229) 评论(0) 推荐(0)
摘要:kruskal重构树本质就是给并查集显式建树来替代可持久化并查集。将边按困难度从小到大排序后建出该树,按dfs序建主席树即可。查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大。 阅读全文
posted @ 2018-09-25 00:17 Gloid 阅读(147) 评论(0) 推荐(0)
摘要:考虑贪心,每次选价值最大的链。选完之后对于链上点dfs序暴力修改子树。因为每个点最多被选一次,复杂度非常正确。 阅读全文
posted @ 2018-09-19 22:30 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:易知所求的是两棵子树大小的乘积。先建出最后所得到的树,求出dfs序和子树大小。之后考虑如何在动态加边过程中维护子树大小。这个可以用树剖比较简单的实现,但还有一种更快更优美的做法就是线段树合并。对每个点开权值线段树,维护当前时刻这棵点为根的子树中,已经和其相连的点的dfs序情况。合并时直接将表示两棵子 阅读全文
posted @ 2018-07-29 15:16 Gloid 阅读(206) 评论(0) 推荐(0)