模板 RMP&LCA
int dp[200050][20],a[200050];
void rmq_st(int n)
{
int i,j;
for(i=1;i<=n;i++)
dp[i][0]=a[i];
int m=(int)(log(1.0*n)/log(2.0));
for(j=1;j<=m;j++)
{
int t=n-(1<<j)+1;
for(i=1;i<=t;i++)
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
inline int rmq_find(int l,int r)
{
int m=(int)(log(1.0*(r-l+1))/log(2.0));
return max(dp[l][m],dp[r-(1<<m)+1][m]);
}
void rmq_st(int n)//求最小值的下标
{
int i,j;
for(i=1;i<=n;i++)
dp[i][0]=i,dp1[i][0]=a[i];
int m=(int)(log(1.0*n)/log(2.0));
for(j=1;j<=m;j++)
{
int t=n-(1<<j)+1;
for(i=1;i<=t;i++)
{
dp1[i][j]=min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
if(dp1[i][j]==dp1[i][j-1])
dp[i][j]=dp[i][j-1];
else
dp[i][j]=dp[i+(1<<(j-1))][j-1];
}
}
}
inline int rmq_find(int l,int r)
{
int m=(int)(log(1.0*(r-l+1))/log(2.0));
int ret=min(dp1[l][m],dp1[r-(1<<m)+1][m]);
if(ret==dp1[l][m])
return dp[l][m];
else
return dp[r-(1<<m)+1][m];
}LCA POJ1330
#include <iostream>
#include <cstdio>
#include <iterator>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
const int MAX=100005;
int dp[MAX][20],a[2*MAX],visit[2*MAX],first[2*MAX],num;
struct Node{
int father;
vector <int> son;
}node[2*MAX];
int getfather(int a)
{
if(node[a].father==-1)
return a;
else
return getfather(node[a].father);
}
void dfs(int cur,int now)
{
if(first[now]==-1)
first[now]=num;
a[num]=cur;
visit[num++]=now;
if(node[now].son.size()==0) //终止条件
return;
for(vector<int>::iterator i=node[now].son.begin();i!=node[now].son.end();i++)
{
dfs(cur+1,*i);
visit[num]=now;
a[num++]=cur;
}
}
void rmq_st(int n)
{
int i,j;
for(i=1;i<=n;i++)
dp[i][0]=a[i];
int m=(int)(log(1.0*n)/log(2.0));
for(j=1;j<=m;j++)
{
int t=n-(1<<j)+1;
for(i=1;i<=t;i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
inline int rmq_find(int l,int r)
{
int m=(int)(log(1.0*(r-l+1))/log(2.0));
return min(dp[l][m],dp[r-(1<<m)+1][m]);
}
int main()
{
int T,i,n;
scanf("%d",&T);
while(T--)
{
memset(first,-1,sizeof(first));
num=1;
scanf("%d",&n);
for(i=0;i<=n;i++)
node[i].father=-1,node[i].son.clear();
int x,y;
for(i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
node[x].son.push_back(y);
node[y].father =x;
}
int fa=getfather(x);
dfs(0,fa);
rmq_st(num-1);
int s,e;
scanf("%d%d",&s,&e);
s=first[s],e=first[e];
if(s>e) swap(s,e);
int res=rmq_find(s,e),ans;
for(i=s;i<=e;i++)
if(a[i]==res)
{
ans=i;
break;
}
printf("%d\n", visit[ans]);
}
return 0;
}
浙公网安备 33010602011771号