1. 程式人生 > >CF734F Anton and School 構造+數論

CF734F Anton and School 構造+數論

splay click yep style || p s != inline space

正解:構造

解題報告:

先放下傳送門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地對,,,就很難過

布星我生氣,不做這題了

先放代碼QAQ

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll int
#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; }
QAQ!

CF734F Anton and School 構造+數論