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