摘要: 题目就是询问将树上哪一条边的权重设为0之后,给定的m条路径的长度的最大值的最小。 我们先考虑序列上怎样做,再扩展到树上。我们先将边权转化为点权,对于最大值最小的问题,考虑二分答案。问题就转化为:是否存在一个数,权值为0之后,所有给定路径的长度和都小于等于mid(其实也就是最大值 \(\leq\) m 阅读全文
posted @ 2020-10-06 14:43 王雨阳 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 树链剖分,将树上的一段路径划分为log条重链,用线段树统计答案。 dfs2时先遍历重儿子,遍历轻儿子时注意判重,注意重新分配的编号 。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #inc 阅读全文
posted @ 2020-10-06 14:20 王雨阳 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 线段树合并裸题。线段树的下标维护的是能力指数,需要离散化。统计答案可以在线段树上查询后缀和。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using n 阅读全文
posted @ 2020-10-06 14:16 王雨阳 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 我们在每一个节点上建立一个动态开点的线段树,最初只有根节点,线段树的叶节点下标维护的是物品类型,值为这种物品的个数。对于将x到y的路径上同时发放类型为w的物品,我们可以采用树上差分。这是对于点的差分,方法为:v[x] += 1, v[y] += 1, v[lca(x,y)] -= 1, v[ fa[ 阅读全文
posted @ 2020-10-06 14:12 王雨阳 阅读(143) 评论(0) 推荐(0) 编辑
摘要: Description sol: 这道题类似区间最大子段和。我们维护 lm, rm, ms,分别表示左右最长子串,全局最长子串。pushup的时候,计算ms时,应该为左右儿子内部的ms与跨越左右区间的ms的最大值。 #include <cstdio> #include <cstring> #incl 阅读全文
posted @ 2020-10-05 08:15 王雨阳 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 题目 sol: 考虑一下冒泡排序的过程,从左侧开始,将第一个数$x_1$拿到第一个比它的的位置,同时将这个比它大的数$x_2$拿到下一个比x_2的的位置,这样一直循环下去。 假设有一次操作,我们将x[i]拿到比它大的位置j上去,那么(i, j)这个区间中的数相当于往前移动的一位,并且逆序对数会减少1 阅读全文
posted @ 2020-10-05 08:10 王雨阳 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 题目 sol: 线段树维护等差数列。lazy_tag维护首项和公差。pushdown时将首项和公差累加到子节点上去。应重新计算右节点的首项。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; c 阅读全文
posted @ 2020-10-04 21:51 王雨阳 阅读(78) 评论(0) 推荐(0) 编辑
摘要: 1.Spaly的启发式合并 2.点分治算法 3.线段树合并 4.树链剖分 /* 一开始每一个节点都是一棵Splay。 对于一个节点u,我们将子节点v都启发式合并到节点u上, 并将v这棵Splay权值整体加上w,然后统计两棵Spaly的节点所形成的答案, 即对于v中的每一个节点,查询 pre(K - 阅读全文
posted @ 2020-09-29 19:35 王雨阳 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 确实不简单。 首先要理解题意。你可以拿掉任意一棵子树,接到一个节点上,但是拿掉的子树的大小并不是1~siz[u]。假设树根为root,我们找到子树中最大的子树,从中拿掉最大的小子树,然后接到根上, 如果这个时候符合题意,那么以root为根就可以通过改造成为树的重心。 问题的关键就是求出以root为根 阅读全文
posted @ 2020-09-26 20:56 王雨阳 阅读(162) 评论(0) 推荐(0) 编辑
摘要: https://www.luogu.com.cn/problem/P3478 一道换根DP题。设f[i]为以i为根的答案。先通过一遍dfs,求出f[1]的值。再自上而下进行DP,求出所有儿子节点的值。若节点u的父亲为fa,我们考虑根从fa变为u后,f[fa]怎样得到f[u]。 再u下方的节点(siz 阅读全文
posted @ 2020-09-25 18:39 王雨阳 阅读(77) 评论(0) 推荐(0) 编辑