zoukankan      html  css  js  c++  java
  • codevs 4605 LCA

    LCA模板题,强制在线的LCA。

    注意:中间的循环顺序!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxv 100005
    #define maxe 200005
    using namespace std;
    int n,m,g[maxv],u,v,anc[maxv][25],root,nume=0;
    int dis[maxv],lastans=0;
    struct edge
    {
    int v,nxt;
    }e[maxe];
    void addedge(int u,int v)
    {
    e[++nume].v=v;
    e[nume].nxt=g[u];
    g[u]=nume;
    }
    void dfs(int u,int fath)
    {
    dis[u]=dis[fath]+1;
    for (int i=g[u];i;i=e[i].nxt)
    dfs(e[i].v,u);
    }
    void work()
    {
    scanf("%d%d",&u,&v);
    u=lastans^u;
    v=lastans^v;
    if (dis[u]>dis[v])
    {
    for (int i=19;i>=0;i--)
    {
    if (dis[anc[u][i]]>=dis[v])
    u=anc[u][i];
    }
    }
    else
    {
    for (int i=19;i>=0;i--)
    {
    if (dis[anc[v][i]]>=dis[u])
    v=anc[v][i];
    }
    }
    if (u==v)
    {
    printf("%d ",u);
    lastans=u;
    }
    else
    {
    for (int i=19;i>=0;i--)
    {
    if (anc[u][i]!=anc[v][i])
    {
    u=anc[u][i];
    v=anc[v][i];
    }
    }
    lastans=anc[u][0];
    printf("%d ",lastans);
    }
    }
    int main()
    {
    memset(g,0,sizeof(g));
    memset(anc,0,sizeof(anc));
    memset(dis,0,sizeof(dis));
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
    scanf("%d",&u);
    if (u==0) root=i;
    else
    {
    anc[i][0]=u;
    addedge(u,i);
    }
    }
    dfs(root,0);
    for (int e=1;e<=19;e++)
    for (int i=1;i<=n;i++)
    anc[i][e]=anc[anc[i][e-1]][e-1];
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
    work();
    return 0;
    }

  • 相关阅读:
    ||和&&
    用jQuery编的一个分页小代码
    Intent携带额外的数据的方法
    Handler消息传递机制
    安卓中的消息提示
    使用AlertDialog创建对话框的大致步骤
    布局管理器
    Android中支持的常用距离单位
    开发自定义View
    Gridview中奇偶数行颜色设置
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5087781.html
Copyright © 2011-2022 走看看