RMQ求LCA
来源:互联网 发布:御剑江湖进阶数据 编辑:程序博客网 时间:2024/06/06 19:57
落谷模板
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#define MAXN 1010001using namespace std;int n,m,to[MAXN],nxt[MAXN],s,head[MAXN],e,pos[MAXN],dfn[MAXN],u,v,dep[MAXN],lg[MAXN];int st[MAXN][20];inline void add( int x,int y){ e++; to[e]=y; nxt[e]=head[x]; head[x]=e;}void dfs(int x,int f){ dfn[++e]=x; pos[x]=e; for(int i=head[x];i;i=nxt[i]) { int y=to[i]; if(y!=f) { dep[y]=dep[x]+1; dfs(y,x); dfn[++e]=x; } }}int lca(int x,int y){ int pc,pcc,l; if(pos[x]>pos[y]) swap(x,y); pc=pos[x]; pcc=pos[y]; l=lg[pcc-pc+1]; if(dep[st[pc][l]]<dep[st[pcc-(1<<l)+1][l]]) return st[pc][l]; else return st[pcc-(1<<l)+1][l];}int main(){// freopen("1.txt","r",stdin); cin>>n>>m>>s; memset(dep,0x7f,sizeof(dep)); for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } e=0; dep[s]=0; dfs(s,0); lg[0]=-1; for(int i=1;i<=e;i++) { st[i][0]=dfn[i]; } //i<=n就行了 for(int i=1;i<=e;i++) { if((i&(i-1))==0) lg[i]=lg[i-1]+1; else lg[i]=lg[i-1]; } for(int i=1;i<=lg[e];i++) //j+(1<<i)-1<=e就行了 { for(int j=1;j+(1<<i)-1<=e;j++) { //右边的dep[st[j+(1<<(i-1)][i-1]]!!! // ↑ //下面else里也是 if(dep[st[j][i-1]]<dep[st[j+(1<<(i-1))][i-1]]) st[j][i]=st[j][i-1]; else st[j][i]=st[j+(1<<(i-1))][i-1]; } } for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); printf("%d\n",lca(u,v)); }}
阅读全文
0 0
- RMQ在线求LCA
- RMQ求LCA
- RMQ求LCA
- lca&rmq
- 【RMQ & LCA】
- RMQ && LCA
- LCA+RMQ
- LCA && RMQ
- LCA+RMQ
- LCA&RMQ
- LCA&RMQ
- LCA&&RMQ
- 【codevs2370】小机房的树,RMQ求LCA
- ST(RMQ)算法(在线)求LCA
- Nearest Common Ancestors 【并查集找根节点】+【步近法在线求lca】or【LCA转RMQ】
- 【lca】lca转rmq poj1330
- 【lca】lca转rmq解法
- 【RMQ+LCA】ZOJ 3195
- Mybatis实现分页
- 网易---合唱团----动态规划
- 总结-2017/9/7
- python对象机制
- 常见的加密算法介绍
- RMQ求LCA
- JAVA设计模式之外观模式
- 第一章:JDK;运算符;变量
- 关于TFTLCD硬件接口和驱动的问题
- python编程之美
- Android控件之PopupWindow弹出窗口
- JAVA第一/二章(下)
- box-shadow的使用技巧总结
- bzoj 1042: [HAOI2008]硬币购物