题目链接: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. frequentism-and-bayesianism-chs-iii

    frequentism-and-bayesianism-chs-iii   频率主义 vs 贝叶斯主义 III:置信(Confidence)与可信(Credibility),频率主义与科学,不能混为一 ...

  2. UML建模类型(转载)

    区分UML模型, UML建模用于不同类型的不同的图.有三个重要类型的UML建模: 结构建模: 系统结构建模捕捉静态功能.它们包括下列各项: 类图 对象图 部署图 包图 复合结构图 组件图 结构模型代表 ...

  3. ios 分类(Category)

      今天研究了类别,都是网上找的资料,类别的作用 类别主要有3个作用:       (1)将类的实现分散到多个不同文件或多个不同框架中.       (2)创建对私有方法的前向引用.       (3 ...

  4. 一个利用window.name实现的windowStorage

    //key:value|key:value var windowStorage = { _inited: false, _data: {}, init: function(str) { var tmp ...

  5. 如何说服你的老板必须使用APM?

    APM研究院 2015/04/24 16:56 2013年,某权威机构提供一组数据显示:亚马逊每100毫秒延迟会使销售额下降1%:雅虎一秒钟服务器延迟导致收入下降2.8%:谷歌搜索结果页面放缓100毫 ...

  6. HDU 3255 Farming (线段树+扫面线,求体积并)

    题意:在一块地上种蔬菜,每种蔬菜有个价值.对于同一块地蔬菜价值高的一定是最后存活,求最后的蔬菜总值. 思路:将蔬菜的价值看做高度的话,题目就转化成求体积并,这样就容易了. 与HDU 3642 Get ...

  7. Asp.net最基本的文件上传功能代码

    aspx前台页面代码 <form id="form1" action="File.aspx" runat="server" encty ...

  8. ExtJs之Ext.form.field.TimePicker DatePicker组合框

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  9. poj 2975 Nim 博弈论

    令ans=a1^a2^...^an,如果需要构造出异或值为0的数, 而且由于只能操作一堆石子,所以对于某堆石子ai,现在对于ans^ai,就是除了ai以外其他的石子 的异或值,如果ans^ai< ...

  10. poj 3662(经典最短路)

    题目链接:http://poj.org/problem?id=3662 思路:这题较多的有两种做法: 方法1:二分枚举最大边长limit,如果图中的边大于limit,则将图中的边当作1,表示免费使用一 ...