tarjan做法:
离线
总时间复杂度是O(nlogn+q)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=500010;
struct ty{
ll t,next;
}edge[N<<1];
ll cnt1=0;
ll head[N];
ll n,m,s;
ll a,b;
template<typename Type>inline void read(Type &xx)
{
Type f=1;char ch;xx=0;
for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())xx=xx*10+ch-'0';
xx*=f;
}
struct ty2//询问结构体
{
ll t,next;
ll same;//会有一组与其相同的询问,
//每次遍历到一组时要同时把另一组去掉
ll num;//询问的编号,最后要按顺序输出
bool flag=0;//标记该询问是否已经被回答过
}q[N<<1];
void addedge(ll a,ll b)
{
edge[++cnt1].t=b;
edge[cnt1].next=head[a];
head[a]=cnt1;
}
ll cnt2=0;
ll head2[N];
ll fa[N];//并查集
void addque(ll a,ll b,ll c/*记录序号*/)
{
q[++cnt2].t=b;
q[cnt2].next=head2[a];
head2[a]=cnt2;
q[cn

这篇博客介绍了三种不同的算法来查找树中两点的最近公共祖先:Tarjan离线算法,倍增算法和RMQ(Range Minimum Query)结合ST表的方法。每种算法的时间复杂度分别为O(nlogn+q),O(nlogn)和O(n*log2(n)),查询时间为O(1)。这些方法都是针对离线查询的优化,并通过具体代码实现来说明了如何在实际问题中应用这些算法。
最低0.47元/天 解锁文章
1380

被折叠的 条评论
为什么被折叠?



