洛谷 P6569 [NOI Online #3 提高组]魔法值

因为 whk,没有参加 OL3,赛后补题。
由于常数问题,必须要 bitset 优化矩阵板子才能通过。

#include <cstdio>
#include <bitset>

const int MAXN = 1e2 + 9;

int n;

struct Matrix{
	std::bitset<MAXN> a[MAXN];
		
	Matrix operator*(const Matrix& b)const{
		Matrix res;
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= n; ++j)
				if(a[i][j])
					res.a[i] ^= b.a[j];
		return res;
	}
}ret[32], ans;

int m, q;
unsigned int f[MAXN], a;

int main(){
	std::scanf("%d%d%d", &n, &m, &q);
	for(int i = 1; i <= n; ++i)
		std::scanf("%u", f + i);
	for(int i = 1; i <= m; ++i){
		int u, v;
		std::scanf("%d%d", &u, &v);
		ret[0].a[u][v] = 1;
		ret[0].a[v][u] = 1;
	}
	for(int i = 1; i < 32; ++i)
		ret[i] = ret[i - 1] * ret[i - 1];
	while(q--){
		std::scanf("%u", &a);
		ans = ret[0]; --a;
		for(unsigned int i = 0; i < 32u; ++i)
			if(a & (1u << i))
				ans = ans * ret[i];
		unsigned int bit = 0u;
		for(int i = 1; i <= n; ++i)
			if(ans.a[1][i])
				bit ^= f[i];
		std::printf("%u\n", bit);
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/natsuka/p/magic.html
今日推荐