lca
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj2144 跳跳棋 二分+lca
这道题刚开始看以为是DP,,,我真是智障了。该DP的看成搜索,该二分的看成DP。。这状态有点危险。。 题意:现在有三个人a,b,c,每一个人可以跳过他左/右边的人,比如说一个人在x,一个在y,那么x可以跳到y+(y-x)(y>x),左边同理。。但是两个人之间不能有另一个人。 现在有三个目标位置和起始位置,让你计算最少的步数让三个人到达目标位置,并不要求人的顺序(即无论哪一个人都可以去任意的终点)原创 2016-08-15 21:17:02 · 738 阅读 · 1 评论 -
倍增LCA复习
时间过去了如此之久,我连倍增LCA都不怎么记得了,要粗事啊。 首先预处理层数和每个节点的父亲,然后预处理p数组,p[i,j]表示i向上第2^j个祖先。最后对于每个询问x,y先把x,y变成同一层数的(x或y向上走直到两个层数相等),然后x,y同时向上走,直到x和y的父亲相同位置。 代码(转自http://www.tuicool.com/articles/N7jQV32)//1. DFS预处理出所有原创 2016-09-20 16:29:11 · 322 阅读 · 0 评论 -
bzoj1602 [Usaco2008 Oct]牧场行走
没什么好说的,裸树上点对距离,用lca,nlogn求解,结果因为主席树打多了。。统计答案的时候写成f[x]+f[y]-f[lca]-f[fa[lca]],这里存储信息方式不同,一个是点,一个是边,所以不能减去fa,而是2*f[lca]。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=原创 2017-03-02 22:30:07 · 194 阅读 · 0 评论 -
bzoj1776[Usaco2010 Hol]cowpol 奶牛政坛
现在才开始刷gold,我真是水的不行了。。分析:这道题,,,我一开始想到了正解,但是以为是n^2的直接放弃了。。想半天没想法,,结果看题解之后一脸懵逼,之后才发现原来我复杂度算错了。。你枚举每个政党内所有点与最大深度的那个点,其实是一遍,所有的政党,不就O(n)..然后lca xjb上。。预处理放在dfs外面居然会wa。。一脸懵逼。#include<cstdio>#include<cstring>原创 2017-04-06 09:16:46 · 253 阅读 · 0 评论 -
bzoj3083 遥远的国度 树链剖分+树上lca
由于懒得重打一遍直接贴上一题的剖分模板,结果因为上一题是单点查询所以一直T,T了5发才发现我是有多sb。。明显不能直接换根,不然我全部操作都是换根你不就炸了。 假设开始的时候root,现在的根是newroot,查询的是x,那么明显有: 1.如果x=newroot,查询全部 2.如果newroot在x外,不受影响,直接查。 3.newroot在x内,查询x子树以外的,即1–pos[x]-1和m原创 2017-07-11 16:50:45 · 294 阅读 · 0 评论 -
codeforces 832D Misha, Grisha and Underground 倍增lca
题意:给一棵树,给出q个询问,每次a,b,c三个点,选择出一个点,使得这个点到其他两个点的公公路径最长。 明显分类讨论,像某人(@SFN1036)一样搞结论是行不通的(○´・д・)ノ。 讨论一下任意两个点的路径,肯定是lca嘛,根据lca的性质,肯定深度比两个点都要小,那么公共路径的话就是(dis(a,b)+dis(b,c)-dis(a,c))/2+1,这个很显然了。 一开始还想过是不是有可能原创 2017-09-27 21:00:43 · 527 阅读 · 0 评论 -
bzoj1977 [BeiJing2010组队]次小生成树 倍增
标准的次小生成树(严格次小) 先想想不严格怎么做(好像都差不多) 枚举每一条边来更新,这是n^2算法。 然后这题的话我们对于每一个点,预处理,倍增一下求他到他的第2^j个父亲所经过的边的最大值和次大值。 然后我们先求出最小生成树,然后对于最小生成树上相邻两个点之间所有边,记录最大值和所选的边的差,如果最大值和原来的边相等就换成次大值,最后答案就是最小生成树+最小差值。#include<cst原创 2017-09-12 18:36:29 · 194 阅读 · 0 评论 -
JZOJ5397. 【NOIP2017提高A组模拟10.6】Biology trie+LCA/哈希
题意:求一些指定串的最长公共后缀,动态加入。傻逼题,被题意坑了,以为要求最长公共LCS。 hash入门题,二分长度以后判断一下是否所有串都相同。 trie+LCA也可以,不过麻烦一点。 trie+LCA:#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#原创 2017-10-06 15:09:46 · 376 阅读 · 0 评论