社区讨论

代码厌氧

P4151[WC2011] 最大XOR和路径参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lqhjw9hc
此快照首次捕获于
2023/12/23 12:18
2 年前
此快照最后确认于
2023/12/23 15:16
2 年前
查看原帖
开 O2 TLE 0pts0pts,不开 AC
CPP
#include<bits/stdc++.h>
using namespace std;
#define LL long long

const int N = 50010, M = 2e5 + 10;
int n, m;
LL ans;
vector<LL> a;

int h[N], ne[M], e[M], idx;
LL w[M];
void add(int a, int b, LL c)
{
	e[++idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
}

bool vis[N];
LL s[N];
bool dfs(int x)
{
	vis[x] = 1;
	for(int i = h[x]; i; i = ne[i])
	{
		int j = e[i];
		if(vis[j])
		{
			if(w[i] ^ s[x] ^ s[j])
				a.push_back(w[i] ^ s[x] ^ s[j]);
		}
		else
		{
			s[j] = s[x] ^ w[i];
			dfs(j);
		}
	}
}

void gauss()
{
	for(int i = 60, j = 0; ~i && j < a.size(); i--)
	{
		for(int k = j; k < a.size(); k++)
			if(a[k] >> i & 1)
			{
				swap(a[j], a[k]);
				break;
			}
		if(~a[j] >> i & 1) continue;
		for(int k = 0; k < a.size(); k++)
			if(k != j && a[k] >> i & 1) a[k] ^= a[j];
		j++; 
	}
}

int main()
{
	cin >> n >> m;
	for(int i = 1, a, b; i <= m; i++)
	{
		LL c;
		scanf("%d%d%lld", &a, &b, &c);
		add(a, b, c), add(b, a, c);
	}
	
	dfs(1);
	sort(a.begin(), a.end(), greater<LL>());
	a.erase(unique(a.begin(), a.end()), a.end());
	
	gauss();
	ans = s[n];
	for(LL i : a)
		if((ans ^ i) > ans) ans ^= i;
	cout << ans << endl;
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...