Xor路

(xor.pas/c/cpp)128MB1s

给定一棵有N个点和N-1条边的树,请你求出树中的最长路径,以及总共有多少条最长路径。

这里路径长度是用xor定义的,即若经过的边的权值为a1, a2, a3,...,an,则这条路径的总权值为 a1 xor a2 xor a3 ... xor an。

输入格式

第1行为一个正整数 N,为点的个数。

第2行至第N行,每行包含三个正整数x,y,z,表示x和y之间有一条权值为z的边。

输出格式

仅一行,包含两个数字,为最长路径的长度和条数。

样例输入

4

1 2 3

2 4 1

1 3 4

样例输出

7 1

样例解释

2-1-3 这条路径,长度为3 xor 4=7。

————————————————————————————————————————————————

首先xor满足 a&a=0

这样之后我们求两个点之间的路径就可以随便找一个点作为树的跟两个点之间的路径就是两个点到跟的路径的xor

这样问题就转换成了给你n个数求两个点亦或和最大值以及方案数

这个n^2明显会超时 但是利用xor的性质 我们可以利用tire来维护 复杂度nlogn

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=3e5+7;
int n,x,y,vis[M],q[M];
LL l[3500007][2],h[3500007];
LL T,w,d[M],mx,ans,sum;
int first[M],cnt;
struct node{int to,next; LL w;}e[2*M];
void ins(int a,int b,LL w){cnt++; e[cnt].to=b; e[cnt].w=w; e[cnt].next=first[a]; first[a]=cnt;}
void insert(int a,int b,LL w){ins(a,b,w); ins(b,a,w);}
void spfa(){
    int head=0,tail=1;
    q[0]=1; vis[1]=1;
    while(head!=tail){
        int x=q[head++]; if(head>M) head=0;
        for(int i=first[x];i;i=e[i].next){
            int now=e[i].to;
            if(vis[now]) continue;
            vis[now]=1; q[tail++]=now; d[now]=d[x]^e[i].w;
            if(tail>M) tail=0;
        }
    }
}
void insert(int num){
    int x=0,now;
    for(int i=30;i>=0;i--){
        now=(num&(1<<i))>>i;
        if(!l[x][now]) l[x][now]=++sum;
        x=l[x][now];
    }
    h[x]++;
}
int find(int num){
    int x=0,now;
    for(int i=30;i>=0;i--){
        now=(num&(1<<i))>>i;
        if(l[x][!now]) x=l[x][!now],T+=(1<<i);
        else x=l[x][now];
    }
    return h[x];
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++) scanf("%d %d %lld",&x,&y,&w),insert(x,y,w);
    spfa();
    for(int i=1;i<=n;i++) insert(d[i]);
    for(int i=1;i<=n;i++){
        T=0; int p=find(d[i]);
        if(T>mx) mx=T,ans=p;
        else if(T==mx) ans+=p;
    }
    printf("%lld %lld\n",mx,ans>>1);
    return 0;
}

时间: 2024-10-24 11:15:49

Xor路的相关文章

几道查询树上点之间的路径的题目

A 求和 时间限制: 1 Sec 空间限制: 256 MB 输入输出文件名:A.in,A.out 题目描述 给出一棵以1为根的有n个节点的树,树上每条边都有其边权. 求所有点对之间的路径上的边权和的总和. 输入格式: 第一行为n 接下来n-1行,每行三个整数,分别表示一条边的两端点编号和边权.(编号为1..n) 输出格式: 输出一个数字表示总和 输入样例 4 1 2 10 2 3 10 1 4 20 输出样例 130 样例解释 1->2:10 , 1->3:20 , 1->4:20 ,

克最通月值得白真员工存段况外引dsym

家卫生健康委员会卫生应急办公室组织编制了公民卫生应急素养条目,并在"4·15全民国家安全教育日"发布.条目共12条,涉及突发公共卫生事件应对,突发事件紧急医学救援.中毒及核和辐射应急处置等基本知识和要求.期望通过发布公民卫生应急素养条目,进一步提高民众卫生应急素养,推进卫生应急社会参与工作,切实维护公民生命安全和身体健康. http://weibo.com/p2018_04_18.Pp/230927981149922743777879派褐麓记杂XWO琶追斡晾 http://weibo.

【BZOJ2115】【Wc2011】 Xor 线性基 异或最长路

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43410545"); } 题意:找一条异或最长路. 题解:先随便来一条路径,然后我们发现这条路径上可以随便加简单环(不管有没有共点共边). 就是因为可以先从某点走到环上来一圈再走回来,这样来去的路径被搞没了,简直污得不行. 然后我们可以用线性基来决定去

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

HDU 4825 Xor Sum(经典01字典树+贪心)

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 1555    Accepted Submission(s): 657 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

数学之路-python计算实战(22)-机器视觉-sobel非线性滤波

sobel非线性滤波,采用梯度模的近似方式 Sobel Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, intksize=3, double scale=1, double delta=0, int

【BZOJ 2115】【WC 2011】Xor

计算1到n的一条路径使得路径上的值xor和最大. 先任意走一条路径计算xor和,然后dfs的时候处理出所有的环的xor和,这样对于所有的环的xor和求线性基,在任意走出的路径的xor和上贪心即可. 正确性显然,如果环与选择的路径有重合,那么重合的部分就会被xor两次,也就没有xor,相当于更改了一部分路径.如果环与选择的路径没有重合,那么相当于从路径上任意一个点到环上的一个点,跑一圈后从进入环的点原路返回,这样环的xor和就计算到了,而往返两次的路径也因为xor了两次相当于没有xor,就不用考虑

【BZOJ 2115】 [Wc2011] Xor

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 962  Solved: 441 [Submit][Status] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进

【BZOJ-2115】Xor 线性基 + DFS

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status][Discuss] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大