题目链接
题意分析
位运算 我们一看就是要对于每一位考虑
对于按位与 a&b 如果对于b的修改超过了a的最高位 那么对于a&b的结果不会有任何影响
我们假设一开始s是0 每变动一位 ta与这一位是1的数的按位与的结果上1的个数的奇偶性就会发生改变
奇偶性改变 对应的正负性也会改变
我们从低位到高位讨论
当修改这一位之后不会再产生影响 当且仅当这一位是这个数的最高位
对于这样的数 我们将他们的权值和累加 如果>0 那么 取负之后对于答案有贡献 我们就把s的这一位置为1 否则为0
为了操作简便 如果一开始的权值和是负数的话 就把每一个权值取负之后再操作、
CODE:
#include<bits/stdc++.h>
#define N 300080
using namespace std;
int n;
long long sum,ans;
struct Node
{
long long val,mask;
int high;
}e[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld%lld",&e[i].val,&e[i].mask);
sum+=e[i].val;
}
for(int i=1;i<=n;++i)
{
for(int j=62;j>=0;--j)
if((1LL<<j)&e[i].mask) {e[i].high=j;break;}
}
if(sum<0)
{
for(int i=1;i<=n;++i) e[i].val=-e[i].val;
}
for(int j=0;j<=62;++j)
{
long long tmp=0;
for(int i=1;i<=n;++i)
if(e[i].high==j) tmp+=e[i].val;
if(tmp>0)
{
for(int i=1;i<=n;++i)
if((1LL<<j)&e[i].mask) e[i].val=-e[i].val;
ans+=(1LL<<j);
}
}
printf("%lld\n",ans);
return 0;
}