CF1870B-Friendly-Arrays-题解

翻译

给出长度为 n 的序列 a 和长度为 m 的序列 b,选出 b 中的任意个数(可以不选),让 a 的每个数都或上它们,求 a1a2an 的最大值和最小值。

思路

x=a1a2an

m=1 时,如果选择 b1,每个 aib1 每位为 1 的二进制位上也为 1,此时 x 在这些位上的值取决于 n 的奇偶性(n1 异或)。取消 m 的限制,可以发现,每多取一个 bix 只会不断变大或变小。

n 为偶数时,x 会不断变小,全部不选时值最大,全选时值最小;

n 为奇数时,x 会不断变大,全选时值最小,全部不选时值最大。

code:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+10;
int t,n,m,a[N],b[N],suma,sumb;
signed main()
{
scanf("%d",&t);
while(t--)
{
suma=sumb=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),suma^=a[i];
for(int i=1;i<=m;i++)scanf("%d",&b[i]),sumb|=b[i];
if(n%2)printf("%d %d\n",suma,suma|sumb);
else printf("%d %d\n",(suma|sumb)-sumb,suma);
}
}
posted @   jr_inf  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示