zoukankan      html  css  js  c++  java
  • Codeforces 734 F Anton and School

    Discription

    Anton goes to school, his favorite lessons are arraystudying. He usually solves all the tasks pretty fast, but this time the teacher gave him a complicated one: given two arrays b and c of length n, find array a, such that:

    where a and b means bitwise AND, while a or b means bitwise OR.

    Usually Anton is good in arraystudying, but this problem is too hard, so Anton asks you to help.

    Input

    The first line of the input contains a single integers n (1 ≤ n ≤ 200 000) — the size of arrays b and c.

    The second line contains n integers bi (0 ≤ bi ≤ 109) — elements of the array b.

    Third line contains n integers ci (0 ≤ ci ≤ 109) — elements of the array c.

    Output

    If there is no solution, print  - 1.

    Otherwise, the only line of the output should contain n non-negative integers ai — elements of the array a. If there are multiple possible solutions, you may print any of them.

    Example

    Input
    4
    6 8 4 4
    16 22 10 10
    Output
    3 5 1 1 
    Input
    5
    8 25 14 7 16
    19 6 9 4 25
    Output
    -1


    有一个显然的性质就是 (a&b)+(a|b)=a+b。
    这个考虑每一位的贡献就行了。
    于是我们可以得到c[i]+b[i]=a[i]*n+∑a[],从而可以开开心心的算出每一个a,然后带回去验证一下就可以了

    /*
       We know that b[i]+c[i]=n*a[i]+∑a[] 
    */
    #include<bits/stdc++.h>
    #define ll long long
    #define maxn 200005
    using namespace std;
    int b[maxn],c[maxn];
    int a[maxn],n,m,ci[60];
    ll tot=0,now;
    int main(){
    	ci[0]=1;
    	for(int i=1;i<=30;i++) ci[i]=ci[i-1]<<1;
    	
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",b+i),tot+=(ll)b[i];
    	for(int i=1;i<=n;i++) scanf("%d",c+i),tot+=(ll)c[i];
    	//tot is used to calculate the sum of array a[]
    	if(tot%(n<<1)){
    		puts("-1");
    		return 0;
    	}
    	
    	tot/=(n<<1);
    	
    	for(int i=1;i<=n;i++){
    		now=c[i]+b[i]-tot;
    		if(now%n){
    			puts("-1");
    			return 0;
    		}
    		a[i]=now/n;
    	}
    	
    	for(int i=0;i<=30;i++){
    		int cnt=0;
    		for(int j=1;j<=n;j++) if(a[j]&ci[i]) cnt++;
    		for(int j=1;j<=n;j++){
    			if(a[j]&ci[i]) b[j]-=cnt*ci[i],c[j]-=n*ci[i];
    			else c[j]-=cnt*ci[i];
    		}
    	}
    	
    	for(int i=1;i<=n;i++) if(c[i]||b[i]){
    		puts("-1");
    		return 0;
    	}
    	
    	for(int i=1;i<=n;i++) printf("%d ",a[i]);
    	return 0;
    }
    

      



  • 相关阅读:
    CSS 整形与优化工具
    下面是小图,点一下上面就会出现大图
    javascript技巧大全
    div实现flash的遮照效果
    表格动态添加删除行
    云计算新模式将终结传统外包模式[转]
    源码过瑞星
    批处理创建、访问、重命名、删除畸形文件/文件夹
    //过360云查杀的代码
    NC反弹提权教程
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8494869.html
Copyright © 2011-2022 走看看