CF1870B

模拟赛时过的一道题,看了大佬的题解,感觉不用那么麻烦。

题目传送门

CF1870B

题意

给你一个长度为 n n n 的数组 a a a,一个长度为 m m m 的数组 b b b。你可以进行若干次操作:选出 b b b 中的任意一个元素 b j b_j bj,然后令所有 a a a 中的元素 a i a_i ai 变为 a i or ⁡ b j a_i \operatorname{or} b_j aiorbj(或运算)。请你求出若干次操作后,数组 a a a 所有元素的异或和的最小值与最大值。此处的“异或和”是指进行操作后,求 a 1 xor ⁡ a 2 xor ⁡ … xor ⁡ a n a_1 \operatorname{xor} a_2 \operatorname{xor} \dots \operatorname{xor} a_n a1xora2xorxoran 的最大值和最小值。

思路

思路很简单。最小值就是异或奇数的情况。最大值是不异或的情况。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+5;
int t,n,m;
int a[maxn],b[maxn];
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		int ansmin=0,minnn=0,minx=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=1;i<=m;i++){
			cin>>b[i];
			minx|=b[i];
		}
		for(int i=1;i<=n;i++){
			minnn^=a[i];
			ansmin^=(a[i]|minx);
		}
		cout<<min(ansmin,minnn)<<" "<<max(ansmin,minnn)<<endl;
	}
	return 0;
}

AC记录

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值