模板 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;
}


posted on 2014-08-23 19:37  一锅土豆  阅读(148)  评论(0编辑  收藏  举报