正解:构造
解题报告:
先放下传送门QwQ
这题首先要知道一个结论:(x&y)+(x|y)=x+y
还是能理解的趴?
所以我们把bi+ci就能得到∑a+n*a[i]
然后我们就能成功求出∑a
然后每个a就能求出来了
然后求出来之后再check下符不符合输入就欧克了!
哦关于那个check,如果一个个枚显然会超时
可以预处理每一位这么加,就从O(n2)变成O(n)辣!
484想通了不难!
等下写了代码放下代码就over辣!
太难过了,,,卡在了第六个测试点(修改之后卡在第五个了yep!
但我觉得我实在做得,zqsg地对,,,就很难过
布星我生气,不做这题了
upd:,,,布星这题是真的好
它给了我一个非常深刻的教训
如果不是为了卡时间还是开longlong趴
因为没开longlong没卡了两三天的事儿我会说:D?
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll long long
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
const ll N=200000+10;
ll n,a[N],b[N],c[N],k[35],sum;
inline ll read()
{
rg ll x=0;rg bool y=1;rg char ch=getchar();
while(ch!='-' && (ch>'9' || ch<'0'))ch=getchar();
if(ch=='-')ch=getchar(),y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
return y?x:-x;
}
inline bool chck()
{
rp(i,1,n)
{
rg ll tmp1=0,tmp2=0;
rp(j,0,29)
{
if((a[i]>>j)&1)tmp1+=(1<<j)*k[j],tmp2+=(1<<j)*n;
else tmp2+=(1<<j)*k[j];
}
if(tmp1!=b[i] || tmp2!=c[i])return 1;
}
return 0;
}
int main()
{
n=read();rp(i,1,n)b[i]=read(),sum+=b[i];rp(i,1,n)c[i]=read(),sum+=c[i];sum/=(n*2);
rp(i,1,n)a[i]=(b[i]+c[i]-sum)/n;
rp(i,1,n)rp(j,0,29)if((a[i]>>j)&1)++k[j];
if(chck()){printf("-1");return 0;}
rp(i,1,n)printf("%d ",a[i]);
return 0;
}