蒟蒻求调
查看原帖
蒟蒻求调
461359
huangrenheluogu楼主2023/12/19 20:15

70 pts,但是都是比较小的点,希望好心大佬帮帮忙。

评测链接

数据

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5, M = 1e5 + 5;
bool f1;
int n, m, fir[N], nxt[N << 1], son[N << 1], w[N << 1], x, y, z, tot = 1, fa[N], dis[N], fax, fay, idx;
struct edge{
	int u, v, w;
}e[M];
struct LB{
	int a[105];
	inline void insert(int x){
		x ^= dis[n];
		for(int i = 60; ~i; i--){
			if(x >> i & 1){
				if(!a[i]){
					a[i] = x;
					return ;
				}
				x ^= a[i];
			}
		}
	}
	inline int query(){
		int res = 0;
		for(int i = 60; ~i; i--){
			if(res >> i & 1) continue ;
			res ^= a[i];
		}
		return res;
	}
}X;
bool f2;
inline void add(int x, int y, int z){
	nxt[++tot] = fir[x];
	fir[x] = tot;
	son[tot] = y;
	w[tot] = z;
}
inline void dfs(int x, int ff = 0){
	for(int i = fir[x]; i ; i= nxt[i]){
		if(son[i] == ff) continue ;
		dis[son[i]] = dis[x] ^ w[i];
		dfs(son[i], x);
	}
}
inline int getdist(int x, int y){
	return dis[x] ^ dis[y];
}
inline int getfa(int x){
	return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
signed main(){
//	printf("%.2lfMB\n", (&f2 - &f1) / 1024.0 / 1024.0);
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i++) fa[i] = i;
	for(int i = 1; i <= m; i++){
		scanf("%lld%lld%lld", &x, &y, &z);
		fax = getfa(x), fay = getfa(y);
		if(fax != fay){
			fa[fax] = fay;
			add(x, y, z), add(y, x, z);
			continue ;
		}
		e[++idx] = (edge){x, y, z};
	}
	for(int i = 2; i <= n; i++) dis[i] = -1;
	dfs(1);
	X.insert(0);
	for(int i = 1; i <= idx; i++){
		if((~dis[e[i].u]) && (~dis[e[i].v])) X.insert(e[i].w ^ getdist(e[i].u, e[i].v));
	}
	printf("%lld\n", X.query());
	return 0;
}
2023/12/19 20:15
加载中...