题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757

题意:给出一棵树,节点有权值。每次询问x到y的路径上与z抑或的最大值。

思路:可持久化trie。

struct Node
{
    int c[2],cnt;
};

Node a[2000005];
int cnt;

int newNode()
{
    cnt++;
    a[cnt].c[0]=a[cnt].c[1]=a[cnt].cnt=0;
    return cnt;
}

struct node
{
    int v,next;
};

node edges[N<<1];
int head[N],e;

void add(int u,int v)
{
    edges[e].v=v;
    edges[e].next=head[u];
    head[u]=e++;
}

int n,m,f[N][20],d[N],dep[N],root[N];

void insert(int u,int p,int d)
{
    int x=root[u],y=root[p],i,k;
    for(i=15;i>=0;i--)
    {
        k=(d>>i)&1;
        a[x].c[k]=newNode();
        a[x].c[!k]=a[y].c[!k];
        a[a[x].c[k]].cnt=a[a[y].c[k]].cnt+1;
        x=a[x].c[k];
        y=a[y].c[k];
    }
}

void DFS(int u,int pre)
{
    f[u][0]=pre; dep[u]=dep[pre]+1;
    root[u]=newNode();
    insert(u,pre,d[u]);
    int i,v;
    for(i=head[u];i!=-1;i=edges[i].next)
    {
        v=edges[i].v;
        if(v==pre) continue;
        DFS(v,u);
    }
}

int getLca(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    int i,k=dep[y]-dep[x];
    FOR0(i,16) if(k&(1<<i)) y=f[y][i];
    if(x==y) return x;
    for(i=16;i>=0;i--)
    {
        if(f[x][i]&&f[y][i]&&f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}

int cal(int x,int y,int z,int val)
{
    int i,k,ans=0,t=f[z][0];
    x=root[x];
    y=root[y];
    z=root[z];
    t=root[t];
    for(i=15;i>=0;i--)
    {
        k=!((val>>i)&1);
        int xx=a[x].c[k];
        int yy=a[y].c[k];
        int zz=a[z].c[k];
        int tt=a[t].c[k];
        if(a[xx].cnt+a[yy].cnt-a[zz].cnt-a[tt].cnt>0) ans|=1<<i;
        else k=!k;
        x=a[x].c[k];
        y=a[y].c[k];
        z=a[z].c[k];
        t=a[t].c[k];
    }
    return ans;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=-1)
    {
        int i;
        FOR1(i,n) RD(d[i]),head[i]=-1;
        cnt=0; e=0;
        FOR1(i,n-1)
        {
            int u,v;
            RD(u,v);
            add(u,v); add(v,u);
        }
        clr(f,0);
        DFS(1,0);
        int j;
        for(i=1;i<=16;i++) FOR1(j,n)
        {
            f[j][i]=f[f[j][i-1]][i-1];
        }
        while(m--)
        {
            int x,y,z;
            RD(x,y,z);
            PR(cal(x,y,getLca(x,y),z));
        }
    }
}

  

HDU 4757 Tree(可持久化trie)的更多相关文章

  1. HDU.4757.Tree(可持久化Trie)

    题目链接 \(Description\) 给定一棵树,点有点权.\(Q\)次询问\(x,y,z\),求\(x\)到\(y\)的简单路径中,与\(z\)异或能得到的最大的数是多少. \(Solution ...

  2. HDU 4757 Tree 可持久化字典树 trie

    http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...

  3. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

  4. HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Su ...

  5. HDU 4757 Tree

    传送门 Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Prob ...

  6. HDU 4757 Tree(可持久化字典树)(2013 ACM/ICPC Asia Regional Nanjing Online)

    Problem Description   Zero and One are good friends who always have fun with each other. This time, ...

  7. HDU4757 Tree(可持久化Trie)

    写过可持久化线段树,但是从来没写过可持久化的Trie,今天补一补. 题目就是典型的给你一个数x,和一个数集,问x和里面的某个数xor起来的最大值是多少. 最原始的是数集是固定的,只需要对数集按照高到低 ...

  8. HDU 4757 Tree(可持续化字典树,lca)

    题意:询问树上结点x到结点y路上上的权值异或z的最大值. 任意结点权值 ≤ 2^16,可以想到用字典树. 但是因为是询问某条路径上的字典树,将字典树可持续化,字典树上的结点保存在这条路径上的二进制数. ...

  9. 可持久化Trie模板

    如果你了解过 01 Trie 和 可持久化线段树(例如 : 主席树 ).那么就比较好去可持久化 Trie 可持久化 Trie 当 01 Trie 用的时候能很方便解决一些原本 01 Trie 不能解决 ...

随机推荐

  1. 网络(一),libevent客户端部分

    网络模块() 一.服务端: 暂时就以libevent模块,共享内存等下 .GS打开,首先创建4个libevent子线程,当然为每个线程设置连接通知回调函数,这个是基于sockpair的,然后再创建一个 ...

  2. mvc从xheditor编辑器中获取内容时存在潜在危险

    xmfdsh在使用xheditor提交要发布的文章等内容的时候出现了如下的错误: 从客户端(Content="<p style="text-align...")中检 ...

  3. 微信连WiFi关注公众号流程更新 解决ios微信扫描二维码不关注就能上网的问题

    前几天鼓捣了一下微信连WiFi功能,设置还蛮简单的,但ytkah发现如果是ios版微信扫描微信连WiFi生成的二维码不用关注公众号就可以直接上网了,而安卓版需要关注公众号才能上网,这样就少了很多ios ...

  4. mydate97时间控件最大值最小值限制及Javascript日期判断大小

    <script language="javascript" type="text/javascript" src="<%=basePath ...

  5. Fiddler手机抓包工具如何设置过滤域名?

    fiddler手机抓包工具如何设置过滤域名?如题.fiddler抓包可以完成我们移动开发者的调试测试需求.所以说抓包尤其重要,但是多余的网页请求和手机的其他链接影响我们手机开发的需求.下面我教大家怎么 ...

  6. centOS学习part1:操作系统安装

    0 linux作为服务器的主要操作系统,在处理速度以及安全性上都要优于windows,虽然需要很多命令要记,但是一般常用的命令不多,用多了就熟悉了,而且现在很多都要图形界面,也降低了学习成本. cen ...

  7. 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView

    李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView 11111222

  8. CentOS系统配置redis

      1.切换到/usr/sr cd /usr/src wget http://download.redis.io/releases/redis-3.2.0.tar.gz   2.解压,安装 tar x ...

  9. Spring-Boot初始篇

    Spring Boot 项目旨在简化创建产品级的 Spring 应用和服务.你可通过它来选择不同的 Spring 平台.可创建独立的 Java 应用和 Web 应用,同时提供了命令行工具来允许 ‘sp ...

  10. Centos挂载windows共享文件夹

    1.windows7共享一个文件夹(1)新建一个用户:devin,密码:admin123(2)在E盘新建一个文件夹,share,并设置共享 对用户devin共享,并让其权限为:读取和写入. 2.lin ...