题意 : 给出一颗无向边构成的树,每一条边都有一个边权,叫你选出一条路,使得此路所有的边的异或值最大。

分析 : 暴力是不可能暴力的,这辈子不可能暴力,那么来冷静分析一下如何去做。假设现在答案的异或值的最大的路的起点和终点分别为 a、b,这个异或值为了方便我用 ⊕(a, b) 表示,那么接下来有一个巧妙的转化 ⊕(a, b) == ⊕(root, a) ^ ⊕(root, b) ,这个转化在 LCA(a, b) == root 的时候明显成立,因为重复的部分会异或两次,相当于没有异或,而LCA(a, b) != root的时候,同样也可以使用上述转化来进行运算,因为这是一棵树,所以最后无论哪两个节点,都至少会有 root 是这两个节点的祖先,因此不必担心 a 和 b 在上述运算出来的结果会有 a 和 b 不联通的情况,那么这题就很好做了,只要从根节点开始DFS,每一次将新节点异或得到新的异或值并丢到字典树里面,这样所有的 ⊕(root, 所有点) 都会到字典树里面去,出来的结果也自然是其中的两个节点一个作为起点一个作为终点出来的路径异或值。表达可能不太好,请见谅,看看代码辅助理解吧……

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<algorithm>
#define LL long long
using namespace std;
;
;
;
int ans;
struct Edge{ int v, Next, weight; };
Edge e[maxn<<];
int Head[maxn];
bool vis[maxn];

inline void Add_Edge(int v, int to, int weight)
{
    e[tot].v = to;
    e[tot].Next = Head[v];
    e[tot].weight = weight;
    Head[v] = tot++;
}

struct Trie
{
    Trie *ch[];
    int v;
    inline void init(){
        ; i<; i++) this->ch[i] = NULL;
        ;
    };
} Heap[maxn<<];
;
Trie *root;
Trie * New()
{
    Heap[node_cnt].init();
    return &Heap[node_cnt++];
}

inline void CreateTrie(int x)
{
    Trie * p = root, *tmp;
    ; i--){
        ;
        if(p->ch[idx] == NULL){
            p->ch[idx] = New();
        }p = p->ch[idx];
    }
    p->v = x;
}

int Query(int x)
{
    Trie *p = root;
    ; i--){
        ;
        ]){
            p = p->ch[idx^];
        }else p = p->ch[idx];
    }
    return (p->v) ^ x;
}
void DFS(int u, int Val)
{
    CreateTrie(Val);///将路径的权值全丢到字典树里面去,代表⊕(root, u)
    vis[u] = true;
    ; i=e[i].Next){
        int v = e[i].v;
        int w = e[i].weight;
        if(!vis[v]){
            ans = max(ans, Query(Val ^ w));///查询更新最值
            DFS(v, Val^w);
        }
    }
}

inline void INIT()
{
    node_cnt = ;
    root = New();
    memset(Head, -, sizeof(Head));
    memset(vis, false, sizeof(vis));
    ans = tot = ;
}

int main(void)
{
    int n;
    while(~scanf("%d", &n)){
        INIT();
        ; i<=n-; i++){
            int u, v, w;
            scanf("%d %d %d" ,&u, &v, &w);
            u++, v++;
            Add_Edge(u, v, w);
            Add_Edge(v, u, w);
        }
        DFS(, );
        printf("%d\n", ans);
    }
    ;
}

瞎 : 想法非常好的题目,利用异或性质转化思想需要学习

POJ 3764 The xor-longest Path ( 字典树求异或最值 && 异或自反性质 && 好题好思想)的更多相关文章

  1. HDU-4825 Xor Sum(字典树求异或最大值)

    题目链接:点此 我的github地址:点此 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整 ...

  2. HDU4825 Xor Sum(字典树解决最大异或问题)

    Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...

  3. poj 3764 The xor-longest Path(字典树)

    题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...

  4. poj3764 The XOR Longest Path【dfs】【Trie树】

    The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted:  ...

  5. 【POJ 3764】 The xor-longest path

    [题目链接] http://poj.org/problem?id=3764 [算法] 首先,我们用Si表示从节点i到根的路径边权异或和 那么,根据异或的性质,我们知道节点u和节点v路径上的边权异或和就 ...

  6. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  7. CH 1602 - The XOR Largest Pair - [字典树变形]

    题目链接:传送门 描述在给定的 $N$ 个整数 $A_1, A_2,\cdots,A_N$ 中选出两个进行xor运算,得到的结果最大是多少? 输入格式第一行一个整数 $N$,第二行 $N$ 个整数 $ ...

  8. HDU 5715 XOR 游戏 二分+字典树

    XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...

  9. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

随机推荐

  1. HTML5——web存储 Web SQL 数据库 应用程序缓存 Web Workers 服务器发送事件 WebSocket

    web存储 比cookie更好的本地存储方式 localStorage - 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除. sessionStorage - 用于临时保存同一窗口( ...

  2. unity shader 热扭曲 (屏幕后处理)

      效果: c# using System; using System.Collections; using System.Collections.Generic; using UnityEngine ...

  3. 《React+Redux前端开发实战》笔记1:不涉及React项目构建的Hello World案例

    本小节实现一个不涉及项目构建的Hello World. [React的第一个Hello World网页] 源码地址:https://jsfiddle.net/allan91/2h1sf0ky/8/ & ...

  4. 应用安全 - 软件漏洞 - sudo漏洞汇总

    sudo Potential bypass of Runas user restrictions(CVE-2019-14287 ) Date:2019.10.14 类型: sudo提权漏洞 影响版本: ...

  5. 【windows】windows安全基础

    windows安全基础 安全主体 security principal 是可以进行身份验证的实体. 哪个安全主体在要求访问?这个维度可以是用户,计算机和进程.一旦确认以后,系统就会发放SID. 例子: ...

  6. spark 2.3.3 的MLlib 使用API

    1.api官网 http://spark.apache.org/docs/2.3.3/ml-guide.html

  7. es7.4.0集群部署

    其实主要是配置的变化,需要指定下master节点 cluster.name: prod-es node.name: node1 node.master: true node.data: true pa ...

  8. spring maven依赖

    图解spring容器 核心容器(core container) spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件要都要使用到这个包里的类,是其它组 ...

  9. BindWeb - Bind智能DNS管理系统介绍

    2019-05-08 演示网站: https://bindw.cdneks.com demo/demo 2018-11-27 修改部署架构,取消网络共享存储设备,在每台BIND服务器启用NFS4并仅向 ...

  10. MySQL explain,type分析(转)

    问题:explain结果中的type字段代表什么意思? MySQL的官网解释非常简洁,只用了3个单词:连接类型(the join type).它描述了找到所需数据使用的扫描方式. 最为常见的扫描方式有 ...