zoukankan      html  css  js  c++  java
  • 洛谷 [P2420] 让我们异或吧

    某两点之间的路径上所有边权的异或值即dis1dis2……disn.
    由于xyy=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv.

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    int read(){
    	int rv=0,fh=1;
    	char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-') fh=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){
    		rv=(rv<<1)+(rv<<3)+c-'0';
    		c=getchar();
    	}
    	return rv*fh; 
    }
    const int MAXN=100005;
    int n,m,po[MAXN],dis[MAXN],nume,numq;
    bool f[MAXN];
    struct edge{
    	int to,nxt,dis;
    }e[MAXN*2];
    void adde(int from,int to,int dis){
    	e[++nume].to=to;
    	e[nume].nxt=po[from];
    	e[nume].dis=dis;
    	po[from]=nume;
    }
    void dfs(int u,int val){
    	f[u]=1;
    	dis[u]=val;
    	for(int i=po[u];i;i=e[i].nxt){
    		int v=e[i].to;
    		if(!f[v]){
    			dfs(v,val^e[i].dis);
    		}
    	}
    }
    int main(){
    	freopen("in.txt","r",stdin);
    	n=read();
    	for(int i=1;i<n;i++){
    		int u=read(),v=read(),dis=read();
    		adde(u,v,dis);adde(v,u,dis);
    	}
    	m=read();
    	dfs(1,0);
    	for(int i=1;i<=m;i++){
    		int u=read(),v=read();
    		//addq(u,v,num);addq(u,v,num);
    		printf("%d
    ",dis[u]^dis[v]);
    	}
    	fclose(stdin);
    	return 0;
    }
    

    p2420

  • 相关阅读:
    【每日一题-leetcode】98.验证二叉搜索树
    python第11天——核心篇3
    python第十天-核心篇2
    光盘文件传输到U盘的问题
    python第九天-核心篇1
    python第八天-飞机大战
    python第7天
    如何解决长时间写代码的颈椎等问题
    python第六天
    python第五天
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868390.html
Copyright © 2011-2022 走看看