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

    luogu2420

    思路:

    非常裸的一道lca的题,维护一个lca数组,一个异或数组,然后在找lca的过程中。进行异或即可。

    代码:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int N=100000+1000,logN=20;
    int lca[N][logN+5],Xor[N][logN+5],a[N];
    struct node
    {
    	int v,nxt,w;
    }e[N*2];
    int ejs,head[N];
    void add(int u,int v,int w) {
    	e[++ejs].v=v;e[ejs].w=w;e[ejs].nxt=head[u];head[u]=ejs;
    }
    int n,dep[N];
    void dfs(int u,int father) {
    	for(int i=1;i<=logN;++i) {
    		lca[u][i]=lca[lca[u][i-1]][i-1];
    		Xor[u][i]=Xor[lca[u][i-1]][i-1]^Xor[u][i-1];
    		if(lca[u][i]==0) break;
    	}
    	for(int i=head[u];i;i=e[i].nxt) {
    		int v=e[i].v;
    		if(v==father) continue;
    		dep[v]=dep[u]+1;
    		lca[v][0]=u;
    		Xor[v][0]=e[i].w;
    		dfs(v,u);
    	}
    }
    int LCA(int x,int y) {
    	if(dep[x]>dep[y]) swap(x,y);
    	int ans=0;
    	for(int i=logN-1;i>=0;--i) {
    		if(dep[lca[y][i]]>=dep[x]) {
    			ans^=Xor[y][i];
    			y=lca[y][i];
    		}
    	}
    	for(int i=logN-1;i>=0;--i) {
    		if(lca[x][i]!=lca[y][i]) {
    			ans^=Xor[x][i];
    			ans^=Xor[y][i];
    			x=lca[x][i];
    			y=lca[y][i];
    		}
    	}
    	if(x!=y) {
    		ans^=Xor[x][0]^Xor[y][0];
    	}
    	return ans;
    
    }
    int main() {
    	scanf("%d",&n);
    	for(int i=1;i<n;++i) {
    		int u,v,w;
    		scanf("%d%d%d",&u,&v,&w);
    		add(u,v,w);
    		add(v,u,w);
    	}
    	dep[0]=-1;
    	dfs(1,0);
    	int m;
    	scanf("%d",&m);
    	while(m--) {
    		int x,y;
    		scanf("%d%d",&x,&y);
    		printf("%d
    ",LCA(x,y));
    	}
    	return 0;
    }
    
  • 相关阅读:
    计算机算法设计与分析<王晓东编著> 2-5有重复元素的排列问题
    oracle 解除锁表sql
    restful
    正则表达式积累
    序列函数
    目录
    mongo 导入json数据
    mysql关于timestamp类型
    bigdecimal 保留小数位
    输出内容到文件(日志输出)
  • 原文地址:https://www.cnblogs.com/wxyww/p/9714538.html
Copyright © 2011-2022 走看看