首页 > 其他分享 >POJ--3764 The xor-longest Path(Trie)

POJ--3764 The xor-longest Path(Trie)

时间:2024-02-10 15:33:05浏览次数:28  
标签:3764 -- memset 异或 value Trie int trie MAXN

记录
13:56 2024-2-10

找到俩个点,获得最大的边权异或值。利用异或的性质,一个值被异或俩次相当于没有异或即 a xor b xor b = a

所以先从顶点出发,获得每个点路径上的异或值,然后对这俩个值进行异或就获得了他们之间路径的异或值。

获取从顶点到每个点路径上的异或值后,可以利用trie来找到最大的值,将值看成二进制数建立Trie
利用异或的特性每次找相反的路径,从而找到与当前值异或得到最大值的值。

点击查看代码
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MAXN = 100010;

typedef unsigned long long ull;
typedef unsigned long ul;

int head[MAXN], ver[MAXN * 2], edge[MAXN  * 2], Next[MAXN * 2], visit[MAXN], tot;
// 根节点到x路径上所有边权的xor值
// value[x] = value[fa[x]] xor tree[fa[x]][x]
int value[MAXN];
int N;

void add(int x, int y, int z) {
	ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
}

void dfs(int x, int fa, int weight) {
    visit[x] = 1;
    if(fa != -1 && weight != -1) {
        value[x] = value[fa] ^ weight;
    }

    for(int i = head[x]; i; i = Next[i]) {
        int y = ver[i];
        if(visit[y] == 0) {
            // y是x的子节点
            dfs(y, x, edge[i]);
        }
    }
}

void dfs(int x) {
    visit[x] = 1;
    for(int i = head[x]; i; i = Next[i]) {
        int y = ver[i];
        if(visit[y] == 0) {
            value[y] = value[x] ^ edge[i];
            // y是x的子节点
            dfs(y, x, edge[i]);
        }
    }
}

int trie[MAXN * 32][2], ind = 1, val[MAXN * 32];

void insert(int x) {
    int p = 1;
    for(int k = 31; k >= 0; k--) {
        // 获取x的第k位
        int v = (x >> k) & 1;
        if(!trie[p][v]) trie[p][v] = ++ind;
        p = trie[p][v];
    }
    val[p] = x;
}

int get(int x) {
    int p = 1;
    for(int k = 31; k >= 0; k--) {
        int v = (x >> k) & 1;
        // 为了获取 xor的最大值 需要走另一个方向 即 v xor 1
        if(trie[p][v ^ 1]) p = trie[p][v ^ 1];
        else p = trie[p][v];
    }
    return val[p];
}

int main() {
    
    while (cin >> N) {
        memset(head, 0, sizeof(head));
        memset(ver, 0, sizeof(ver));
        memset(Next, 0, sizeof(Next));
        memset(edge, 0, sizeof(edge));
        memset(visit, 0, sizeof(visit));
        memset(value, 0, sizeof(value));
        tot = 0;
        memset(trie, 0, sizeof(trie));
        memset(val, 0, sizeof(val));
        ind = 1;
        int u, v, w;
        for(int i = 0; i < N - 1; i++) {
            scanf("%d%d%d", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);
        }

        dfs(0);
        // dfs(0, -1, -1) 另一种写法 太繁琐了

        int result = 0;
        // 利用 trie树求最大异或值
        // The XOR Largest Pair
        for(int i = 0; i < N; i++) {
            result = max(result, value[i] ^ get(value[i]));
            insert(value[i]);
        }
        cout << result << endl;
    }
}

标签:3764,--,memset,异或,value,Trie,int,trie,MAXN
From: https://www.cnblogs.com/57one/p/18012896

相关文章

  • 在k8S中,外部如何访问集群内的服务?
    在Kubernetes(k8s)中,要让外部客户端能够访问集群内的服务,通常有以下几种方式:NodePort:创建一个类型为NodePort的服务,这会在每个工作节点上开放一个特定端口(系统自动分配或用户指定的范围内的端口),并将流量转发到对应Service背后的Pod。外部客户端可以通过任意节点的IP地址和......
  • 冗余路径
    这道题目是一个模型:给连通的无向图加边,使得无向图没有桥(即变成边双连通分量),最小化加边数因为边双连通分量本来就没有桥,所以我们考虑对整个图求一遍边双连通分量(使用tarjan算法),然后将边双连通分量缩为一个点考虑。那么缩完点后得到的图一定是一棵树(因为图中不可能存在环)然后要......
  • QOJ 8171 - Cola
    我们假设目前B知道排列\(p\)的前\(x\)位是多少,那么下一次,B的最优策略是:对于\(i\lex\)的部分,令\(q_i=p_i\)。对于\(i=x+1\)的部分,令\(q_i\)为任一\(p_i\)可能取到但没有被猜过的值。对于\(i>x+1\),随机乱排剩余的\(q_i\)。考虑设\(c_i\)表示第\(i\)次......
  • Atcoder Grand Contest 056 B - Range Argmax
    因为一组\(x\)可能对应多组\(p\),考虑怎么让决策唯一化。我们从大到小依次钦定每个值的位置,即倒着遍历\(i=n,n-1,\cdots,1\),找到最左端的位置\(v\)满足,对于现在还活着的所有区间\(j\)满足\(l_j\lev\ler_j\),都有\(x_j=v\),令\(p_j=i\),然后删去所有包含\(i\)的区间。......
  • Atcoder Grand Contest 041 F - Histogram Rooks
    考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为\(A\)。把与\(A\)中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是\(2^{\text{剩余点的个数}}\),乘以\((-1)^{|A|}\)并求和即可。这个做法直接优化显然不行。我们考虑设\(A\)中的点所在的列组成的不可重集......
  • 计网前导知识
    一、网络、互联网、因特网的关系​ 二、计算机网络的定义和分类1.按交换方式区分​ 2.按使用者分类​ 3.按传输介质分类​ 4.按覆盖范围分类​ 5.按拓扑结构分类​ 总线型、星型、环形、网状型三、计算机网络的性能指标1.速率​ 2.带宽​ 3.吞吐量​ 4.时延......
  • 接口幂等性详解
    概述所谓接口幂等性就是:在特定场景下,同一条件的多次接口调用,保证操作只执行一次,如果接口没有保证幂等性,在以下场景就会产生问题前端重复提交:用户进行注册、创建个人信息等操作,由于网络抖动导致页面没有及时响应,用户认为没有成功而多次点击提交按钮,发生重复提交表单请求接口超......
  • 在k8S中,Headless Service是什么?
    在Kubernetes(k8s)中,HeadlessService是一种特殊类型的Service,它不会被分配一个ClusterIP(集群内部的虚拟IP地址),而是直接将服务背后的PodIP地址暴露给客户端。当创建HeadlessService时,其spec.clusterIP字段设置为"None"。HeadlessService的主要特征和用途包括:DNS解析:Kuberne......
  • SharePoint Online 中Excel引用另一个Excel中的单元格
    前言最近,碰到一个需求,用户想要在SharePointOnline中从一个Excel文件引用另一个Excel文件的内容,所以就研究了一下。正文1.建一个测试的Excel文件,随便写点东西,如下图:2.新建另一个Excel,用来引用上一个Excel文件,如下图:3.在第一个Excel中的文件,选中单......
  • 在k8S中,Servic类型有哪些?
    在Kubernetes(k8s)中,Service是用于定义一组Pod的访问策略和机制的资源对象。以下是KubernetesService支持的主要类型:ClusterIP:这是默认的服务类型。创建一个仅集群内部可访问的虚拟IP地址(VIP)。应用程序只能通过内部集群DNS名称从集群内的其他Pod或服务访问这个Service。No......