摘要: 统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当于一个容斥) 算点对用排序+双指针即可 cpp include include include us 阅读全文
posted @ 2018-12-11 21:43 lokiii 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m dis[p]]+de[p]) 这里注意更新和初始化的时候不能对整个mn操作,这样时间复杂度是错的,要开一个栈存一下更新了哪些点,只初始化这些点即可 阅读全文
posted @ 2018-12-11 18:38 lokiii 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出、没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路径是两边拼起来至少有一个休息点的路径,每次假如新儿子都和之前的儿子组合一遍即可,注意f[0][0]实 阅读全文
posted @ 2018-12-11 16:32 lokiii 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long;比较的时候因为编号也占权重所以要比较pair;编号不是mid!不是mid!是初始输入的那个编号!~~搞混调了很久~~ cpp include include include include inclu 阅读全文
posted @ 2018-12-11 09:06 lokiii 阅读(161) 评论(0) 推荐(0) 编辑