随笔分类 -  2-1lca

摘要:我们发现,这个染色的操作他就很像LCT中access的操作(为什么??),然后就自然而然地想到,其实一个某条路径上的颜色数量,就是我们做一个只有access操作的LCT,这条路径经过的splay的数量 然后考虑怎么样来维护这个数量。access的过程中,有实边变虚边、虚边变实边的操作,对应过来,实边 阅读全文
posted @ 2018-10-19 14:56 Ressed 阅读(287) 评论(0) 推荐(0)
摘要:如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1),其中j是守卫(也就是边) 市民要在路上所有边看到狗:建边(i,j,1),其中i是市民,j是i经过的 阅读全文
posted @ 2018-10-18 20:23 Ressed 阅读(673) 评论(0) 推荐(0)
摘要:一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用set维护 阅读全文
posted @ 2018-10-18 17:02 Ressed 阅读(199) 评论(0) 推荐(0)
摘要:首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 阅读全文
posted @ 2018-10-18 16:47 Ressed 阅读(823) 评论(0) 推荐(0)
摘要:先用kruskal处理出一个最小生成树 对于非树边,倍增找出两端点间的最大边权-1就是答案 对于树边,如果它能被替代,就要有一条非树边,两端点在树上的路径覆盖了这条树边,而且边权不大于这条树边 这里可以树剖来做,但是不想用.. 如果先把非树边从小到大排序然后去覆盖树边,那么一条树边只需要被覆盖一次 阅读全文
posted @ 2018-10-18 16:32 Ressed 阅读(776) 评论(0) 推荐(0)
摘要:可以证明,如果合并两棵树,新的直径的端点一定是原来两树中直径的端点 可以把新加两个点的操作看成是把两个只有一个点的树合并到原来的树上,然后用其中的一个点去和原来树上的直径两端点更新直径就可以了 阅读全文
posted @ 2018-10-18 16:17 Ressed 阅读(475) 评论(0) 推荐(0)
摘要:先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 阅读全文
posted @ 2018-10-18 16:00 Ressed 阅读(318) 评论(0) 推荐(0)
摘要:根为r时x、y的公共祖先,就是lca(x,r),lca(x,y),lca(r,y)中深度最大的那一个,不要再在倍增的时候判来判去还判不对了... 阅读全文
posted @ 2018-10-09 10:39 Ressed 阅读(114) 评论(0) 推荐(0)
摘要:(警告:本篇博客包含大量人类本质内容) 先处理出来lca,然后就只需要知道从每个点到他的父亲、和从他的父亲到这个点的期望时间就可以了 我们设f[x]为x到他父亲的期望时间;g[x]为从x的父亲到x的期望时间(注意到这两个是不一样的) 只考虑怎么算f,g是类似的 从某个点想走到他父亲时,情况会有:直接 阅读全文
posted @ 2018-10-06 20:57 Ressed 阅读(280) 评论(0) 推荐(0)
摘要:我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有长度>x的路径,给他的两端点处++,lca处--,这样统计树上每个点的子树的和,就是这个点与它父节点 阅读全文
posted @ 2018-09-25 21:29 Ressed 阅读(183) 评论(0) 推荐(0)
摘要:经过部分分的提示,我们可以把一条路径切成s到lca 和lca到t的链 这样就分为向上的链和向下的链,我们分开考虑: 向上:如果某一个链i可以对点x产生贡献,那么有deep[x]+w[x]=deep[S[i]],而且S[i]和lca[i]都在x的子树中 向下:如果某一个链i可以对点x产生贡献,那么有d 阅读全文
posted @ 2018-09-24 18:04 Ressed 阅读(246) 评论(0) 推荐(0)
摘要:发现对于某一个点它向上发的一条边,它被经过的次数就是这个点子树数量*不是它子树的数量 那就维护一个前缀和,然后每次拿两个端点和它们的lca的值加一加减一减,再乘上加上的值,就是这次修改后答案的增量 (最后答案还要除以(N*N)) 倍增会被卡空间,难受 阅读全文
posted @ 2018-09-13 23:16 Ressed 阅读(291) 评论(0) 推荐(0)
摘要:用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了 阅读全文
posted @ 2018-09-13 23:06 Ressed 阅读(197) 评论(0) 推荐(0)
摘要:https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度, 阅读全文
posted @ 2018-09-11 16:37 Ressed 阅读(223) 评论(0) 推荐(0)