zoukankan      html  css  js  c++  java
  • luoguP2420 让我们异或吧

    luoguP2420 让我们异或吧

    题目描述

    给定一棵树,询问两点间路径上边权异或和

    solution

    显然想到树上查分

    由于异或的性质,并不用算LCA

    只用DFS预处理到根的异或和

    #include<bits/stdc++.h>
    
    using namespace std;
    
    #define MAXN 100010
    
    inline int read()
    {
        int f=1,x=0;
        char ch;
        do
        {
            ch=getchar();
            if(ch=='-') f=-1;
        }while(ch<'0'||ch>'9');
        do
        {
            x=(x<<3)+(x<<1)+ch-'0';
            ch=getchar();
        }while(ch>='0'&&ch<='9');
        return f*x;
    }
    
    struct node
    {
        int to;
        int next;
        int val;
    };
    
    int n,m;
    node g[MAXN*2]; 
    int cnt=0,head[MAXN];
    int xors[MAXN];
    
    inline void addedge(int u,int v,int w)
    {
        ++cnt;g[cnt].to=v;g[cnt].next=head[u];g[cnt].val=w;head[u]=cnt;return;
    }
    
    inline void dfs(int x,int fa)
    {
        for(int i=head[x];i;i=g[i].next)
        {
            int v=g[i].to;
            if(v!=fa)
            {
                xors[v]=xors[x]^g[i].val;
                dfs(v,x);    
            } 
        }
        return;
    }
    
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)head[i]=-1;
        for(int i=1;i<n;i++)
        {
            int u=read(),v=read(),w=read();
            addedge(u,v,w);
            addedge(v,u,w);
        }
        dfs(1,0);
        m=read();
        for(int i=1;i<=m;i++)
        {
            int x=read(),y=read();
            cout<<(xors[x]^xors[y])<<endl;
        }
    }
  • 相关阅读:
    web移动端开发经验总结
    《前端JavaScript面试技巧》笔记一
    《SEO在网页制作中的应用》视频笔记
    web前端开发笔记(2)
    OAuth2.0理解和用法
    基于hdfs文件创建hive表
    kafka 配置事项
    centos7时间同步
    lambda架构
    hbase hadoop版本
  • 原文地址:https://www.cnblogs.com/wlzs1432/p/9350855.html
Copyright © 2011-2022 走看看