题目
题意给定两个长度为n的数组a,b。 定义c[i] = a[i] ^ b[i] 令f = c[1] & c[2] & … & c[n]
这里^, &分别代表异或运算, 与运算。
允许重新排列b数组。
求f的最大值。
思路对于这种位运算求最大值的题目,考虑从高位到低位去确定答案。
对于c数组的第i位,如果它能取1,说明c[i]在第i位都是1(与运算的性质),说明a[i]在第i位上0的个数和b[i]在第i位上1的个数相等(异或运算的性质)。
我们从高位到低位去做分层。
- 如果当前第i位可以取1,则继续划分区间,判断下一位。
- 如果当前第i位不可以取1,则保留当前的区间划分。
详见代码
代码#include
using namespace std;
const int maxn = 200010;
int n, m;
vector a, b;
int res;
void solve() {
scanf("%d", &n);
a.resize(n);
b.resize(n);
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?