倍增
RMQ问题
我们用
查询区间
预处理时间复杂度
int a[N],dp[N],n; void prep(){//预处理 for(int i=1;i<=n;i++){ cin>>a[i]; dp[i][0]=a[i]; } for(int j=1;(1<<j)<=n;j++){ for(int i=1;i<=n;i++){ dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); } } } int query(int l,int r){//查询 int k=log2(r-l+1); return max(dp[l][k],dp[r-(1<<k)+1][k]); }
LCA
最近公共祖先简称LCA(Lowest Common Ancestor).两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个.
本题考虑倍增,用
int vis[N],dis[N],f[N][20]; vector<int>g[N]; void dfs(int x,int d){ vis[x]=1; dis[x]=d; for(int i=1;(1<<i)<=k;i++){ f[x][i]=f[f[x][i-1]][i-1]; } for(int v:g[x]){ if(v==fa[x][0]) continue; fa[v][0]=x; dfs(v,d+1); } } int lca(int x,int y){ if(dis[y]>dis[x]) swap(x,y); int k=dis[x]-dis[y]; for(int i=1;(1<<i)<=k;i++){//对于xy距离k进行二进制划分 if(k&(1<<i)) x=fa[x][i]; } if(x==y) return x; for(int i=19;i>=0;i--){//从上往下跳,最后一定跳到LCA的下一层 if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; } return fa[x][0]; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】