LCA(RMQ)
const lx=;
xh=;
var L,p,nt:array[..lx*] of longint;
lt,dfn,fr,dep:array[..lx] of longint;
f:array[..lx*,..xh] of longint;
vis:array[..lx] of boolean;
i,x,y,n,sum,q:longint;
procedure swap(var a,b:longint);
var c:longint;
begin
c:=a; a:=b; b:=c;
end;
procedure dfs(u:longint);
var i,v:longint;
begin
inc(sum); dfn[u]:=sum; vis[u]:=true;
inc(L[]); L[L[]]:=u;
fr[u]:=L[];
i:=lt[u];
while i<> do
begin
v:=p[i];
if not vis[v] then
begin
dep[v]:=dep[u]+;
dfs(v);
inc(L[]); L[L[]]:=u;
end;
i:=nt[i];
end;
end;
procedure prepare;
var i,j:longint;
begin
fillchar(fr,sizeof(fr),);
fillchar(vis,sizeof(vis),false);
fillchar(L,sizeof(L),);
sum:=;
dep[]:=;
dfs();
for i:= to L[] do f[i,]:=L[i];
for i:= to xh do
for j:= to L[] do
if j+<<i-<=L[] then
if dfn[f[j,i-]]<dfn[f[j+<<(i-),i-]] then f[j,i]:=f[j,i-]
else f[j,i]:=f[j+<<(i-),i-];
end;
procedure add(x,y:longint);
begin
inc(sum); p[sum]:=y; nt[sum]:=lt[x]; lt[x]:=sum;
end;
function find(s,t:longint):longint;
var k:longint;
begin
s:=fr[s]; t:=fr[t];
if s>t then swap(s,t);
k:=trunc(ln(t-s+)/ln());
if dfn[f[s,k]]<dfn[f[t-<<k+,k]] then exit(f[s,k]) else exit(f[t-<<k+,k]);
end;
function dis(s,t:longint):longint;
var k:longint;
begin
k:=find(s,t);
exit(dep[t]-dep[k]+dep[s]-dep[k]);
end;
begin
readln(n);
fillchar(lt,sizeof(lt),);
sum:=;
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
prepare; end.
LCA(RMQ)的更多相关文章
- ST(RMQ)算法(在线)求LCA
在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...
- 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)
题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...
- nyoj 119 士兵杀敌(三)(RMQ)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...
- hdu 3183 A Magic Lamp(RMQ)
A Magic Lamp Time Limi ...
- Balanced Lineup(RMQ)
原题传送门 就是裸RMQ啊.. 求区间最大值和区间最小值,一看就像RMQ,当然线段树貌似也可以. 至于算法嘛.自己学~(好吧,放个传送门...) 然后就是最后把maxsum-minsum就好啦233~ ...
- UVA-11235 Frequent values (RMQ)
题目大意:在一个长度为n的不降序列中,有m次询问,每次询问(i,j)表示在区间(i,j)中找出出现次数最多的元素的出现次数. 题目分析:因为序列有序,可以将序列分段,并且记录每段的元素个数.每一个元素 ...
- UVa11235 FrequentValues(RMQ)
Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...
- 【暑假】[实用数据结构]范围最小值问题(RMQ)
范围最小值问题: 提供操作: Query(L,R):计算min{AL ~ AR } Sparse-Table算法: 定义d[i][j]为从i开始长度为2j的一段元素的最小值.所以可以用递推的方法表示. ...
- UVA 11235 Frequent values(RMQ)
Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...
随机推荐
- VS2010中将当前选定项目做为启动项
Visual Studio 2010一个解决方案中多个项目,如果想选择哪个项目就设置哪个项目为启动项可以这么做. 一.对于以后新建的解决方案想这样通过VS设置工具: 二.对于已经存在的解决方案可以这样 ...
- iOS 中对 HTTPS 证书链的验证
这篇文章是我一边学习证书验证一边记录的内容,稍微整理了下,共扯了三部分内容: HTTPS 简要原理: 数字证书的内容.生成及验证: iOS 上对证书链的验证. HTTPS 概要 HTTPS 是运行在 ...
- WCF学习笔记
1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ...
- HTML:表格与表单
一.图片热点:规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- C#获取相对路径的方法
这八种C#获取相对路径的方法,包括获取和设置当前目录的完全限定路径.获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称等等内容. C#获取相对路径1. 获取和设置当前目录的完全限定路径. ...
- Go语言并发与并行学习笔记(二)
转:http://blog.csdn.net/kjfcpua/article/details/18265461 Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goro ...
- Spring学习(二)——Spring中的AOP的初步理解[转]
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- FZU 1914 Funny Positive Sequence
题目链接:Funny Positive Sequence 题意:给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个数列的这n种变换里, A(0): a1, ...
- oracle遇到死锁杀进程
java程序操作数据库的时候,遇到死锁:java.sql.SQLException: ORA-00060: 等待资源时检测到死锁 解决步骤: 1.找到死锁的oralce对象(表): select ob ...
- oracle查询语句大全
1.查处oracle数据库的字符编码格式 select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET'; 如果查出的是ZH ...