WA 0pts 求条
查看原帖
WA 0pts 求条
1078491
_ckx_楼主2024/11/7 12:06

rt,找了好久找不到错,方法是参考第一篇题解

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
#define pii pair<int ,int>
#define mkp make_pair
#define ft first
#define sd second

int n ,q;
const int N = 2e4 + 10 ,M = 70 ,P = 20;
struct Basis{
	int pos[M];
	ll basis[M];
	
	Basis()
	{
		memset(pos ,0 ,sizeof(pos));
		memset(basis ,0 ,sizeof(basis));
	}
	void insert(ll x ,int p)
	{
		for (int i = M - 1;i >= 0;i--)
		{
			if (!((x >> i) & 1))
				continue;
			if (!basis[i])
			{
				basis[i] = x;
				pos[i] = p;
				break;
			}
			if (p > pos[i])
				swap(p ,pos[i]) ,swap(basis[i] ,x);
			x ^= basis[i];
		}
	}
	ll query(int l)
	{
		ll ret = 0;
		for (int i = M - 1;i >= 0;i--)
			if (pos[i] >= l)
				ret = max(ret ,ret ^ basis[i]);
		return ret;
	}
};
Basis b[N];
vector<int> G[N];
ll a[N];
int dep[N] ,f[N][P];

void dfs(int u ,int pre)
{
	dep[u] = dep[pre] + 1;
	b[u] = b[pre];
	b[u].insert(a[u] ,dep[u]);
	f[u][0] = pre;
	for (auto v : G[u])
		if (v != pre)
			dfs(v ,u);
}

void init()
{
	for (int i = 1;i < P;i++)
		for (int j = 1;j <= n;j++)
			f[j][i] = f[f[j][i - 1]][i - 1];
}

int LCA(int x ,int y)
{
	if (dep[x] < dep[y])
		swap(x ,y);
	for (int i = P - 1;i >= 0;i--)
		if (dep[f[x][i]] >= dep[y])
			x = f[x][i];
	if (x == y)
		return x;
	
	for (int i = P - 1;i >= 0;i--)
		if (f[x][i] != f[y][i])
			x = f[x][i] ,y = f[y][i];
	return f[x][0];
}

int main()
{
	scanf("%d%d",&n ,&q);
	
	for (int i = 1;i <= n;i++)
		scanf("%lld",&a[i]);
	
	for (int i = 1;i < n;i++)
	{
		int x ,y;
		scanf("%d%d",&x ,&y);
		
		G[x].push_back(y);
		G[y].push_back(x);
	}
	
	dfs(1 ,0);
	
	init();
	
	while (q--)
	{
		int x ,y;
		scanf("%d%d",&x ,&y);
		
		int lca = LCA(x ,y);
		
//		printf("%d\n",lca);
		
		Basis bas;
		for (int i = M - 1;i >= 0;i--)
		{
			if (b[x].pos[i] >= dep[lca])
				bas.insert(b[x].basis[i] ,1);
			if (b[y].pos[i] >= dep[lca])
				bas.insert(b[y].basis[i] ,1);
		}
		
		printf("%lld\n",bas.query(0));
	}
	
    return 0;
}
2024/11/7 12:06
加载中...