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 ...
随机推荐
- iOS app性能优化的那些事
iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...
- GO工程和包
转载:http://blog.csdn.net/achelloworld/article/details/43956831 在Go语言中,包是函数与数据的集合,用package定义一个包,包的名字不一 ...
- 利用VBoxManage对虚拟机格式vdi、vmdk、vhd进行互转
虚拟机顾名思义就是虚拟出来的机器(virtual machine),虚拟化技术也是时下IT界最热门的技术,因其能更加有效利用硬件资源,整合IT应用,降低TCO,节能环保等,说白了就是一台硬件上够强 ...
- Entity Framework 复杂类型
为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string Compan ...
- C# webbrowser 修改useragent
http://www.lukepaynesoftware.com/articles/programming-tutorials/changing-the-user-agent-in-a-web-bro ...
- uva 1428
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 基于SOCK4网络协议的代理服务器端代码示例
//********************************************************************** #include <stdio.h> #i ...
- ZOJ 3646 Matrix Transformer 二分匹配,思路,经典 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4836 因为要使对角线所有元素都是U,所以需要保证每行都有一个不同的列上有U,设 ...
- hdu 4628 Pieces
http://acm.hdu.edu.cn/showproblem.php?pid=4628 状态压缩DP 时间复杂度应该是 16*(2^32) 但是运行时要远小于这个数 所以加一定剪枝就可以过 代码 ...
- C#窗体的加载等待(BackgroundWorker控件)实现
窗体拉一个Button按钮和一个加载等待显示的label, label默认隐藏,点击按钮时显示这个label,加载完再隐藏 1.工具箱拉BackgroundWorker控件到窗体 2.backgrou ...