Problem A. 最近公共祖先 (commonants.c/cpp/pas) 注意 Input file: commonants.in Output file: commonants.out Time Limit : 0.5 seconds Memory Limit: 512 megabytes 题面 最近公共祖先\(\text{(Lowest Common Ancestor,LCA)}\)是指在一个树中同时拥有给定的两个点作为后 代的最深的节点. 为了学习最近公共祖先,你得到了一个层数为\…
Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Memory Limit: 512 megabytes 题面 \(\text{HLY}\)在玩一个即时战略\(\text{(Real Time Strategy)}\)游戏.与大多数同类游戏类似,这个游戏的地图是平面的,并且玩家都有一个基地. \(\text{HLY}\)的对手杰哥的基地是一个\(w \…
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错题了,码完暴力就已经 2.5h 了 接下来就会开始看 T3 看到了部分分非常令人欣喜(码起主席树根本停不下来). 一直到考试结束都没想起我那 T1 . T1 最长不下降子序列 解题思路 对于比较小的数据可以直接 \(mathcal{O(nlogn)}\) 求出来(洗提 30 pts) 发现对于同一递…
多校第七场考了一道lca,那么就挑一道水题学习一下吧= = 最简单暴力的方法:建好树后,输入询问的点u,v,先把u全部的祖先标记掉,然后沿着v->rt(根)的顺序检查,第一个被u标记的点即为u,v的公共祖先. 标记的时候又犯老毛病了:while,do while都不对,最后还是while(1)了T^T #include<cstdio> #include<cstring> ; int p[MAXN],vis[MAXN]; int main() { int T,n,u,v; sc…
题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一个…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 复制 5 5 4 3 1 2 4…
UPDATE(20180822):重写部分代码. 1.前言 最近公共祖先(LCA),作为树上问题,应用非常广泛,而求解的方式也非常多,复杂度各有不同,这里对几种常用的方法汇一下总. 2.基本概念和暴力算法 最近公共祖先,顾名思义,指的是两个点的公有祖先中,最近的那个点.它显然不会作为一个单独的知识点拿出来考,但是在很多题目中,出现的频率很高,不同场合用不同的方法.先考虑最简单的做法.找祖先,显然是从所查询的两个点从下往上爬,直到两个点出现第一次重叠时,就是最近公共祖先了.首先我们预处理出所有点的…
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决.     这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O(n); 先介绍在线算法:     1) dfs:      对于图所示的树,我们从根节点1开始dfs,按照先序访问(不算完全的先序),那么它访问顺序就是1 -> 2 -> 4 -> 2 -> 5 -> 7 -> 5 -> 8 -> 5 -> 2 ->…
基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的数列A,回答若干询问RMQ(A,i,j),返回数列A中下标在[i,j]里的最小值下标. 朴素LCA算法 求出树上每个结点的深度. 对于查询LCA(u,v),用p1.p2指向将u.v,将p1.p2中深度较大的结点不断指向其父结点,直到p1.p2深度相同. 之后p1.p2同步向上移动,直到p1=p2,此…
最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表得到它们的长度,并求出两个长度之差.在长的链表上先遍历若干个点之后,再同步遍历两个链表,知道找到相同的结点,或者一直到链表结束). BST 不用递归recursive,迭代iterative就行 public int query(Node t, Node u, Node v) { int left…