当前位置: 代码迷 >> 综合 >> B. Curiosity Has No Limits
  详细解决方案

B. Curiosity Has No Limits

热度:11   发布时间:2023-11-22 13:52:49.0

题目链接
When Masha came to math classes today, she saw two integer sequences of length n?1 on the blackboard. Let’s denote the elements of the first sequence as ai (0≤ai≤3), and the elements of the second sequence as bi (0≤bi≤3).

Masha became interested if or not there is an integer sequence of length n, which elements we will denote as ti (0≤ti≤3), so that for every i (1≤i≤n?1) the following is true:

ai=ti|ti+1 (where | denotes the bitwise OR operation) and
bi=ti&ti+1 (where & denotes the bitwise AND operation).
The question appeared to be too difficult for Masha, so now she asked you to check whether such a sequence ti of length n exists. If it exists, find such a sequence. If there are multiple such sequences, find any of them.

Input
The first line contains a single integer n (2≤n≤105) — the length of the sequence ti.

The second line contains n?1 integers a1,a2,…,an?1 (0≤ai≤3) — the first sequence on the blackboard.

The third line contains n?1 integers b1,b2,…,bn?1 (0≤bi≤3) — the second sequence on the blackboard.

Output
In the first line print “YES” (without quotes), if there is a sequence ti that satisfies the conditions from the statements, and “NO” (without quotes), if there is no such sequence.

If there is such a sequence, on the second line print n integers t1,t2,…,tn (0≤ti≤3) — the sequence that satisfies the statements conditions.

If there are multiple answers, print any of them.

input
4
3 3 2
1 2 0

output
YES
1 3 2 0

input
3
1 3
3 2

output
NO

Note
In the first example it’s easy to see that the sequence from output satisfies the given conditions:
t1|t2=(012)|(112)=(112)=3=a1 and t1&t2=(012)&(112)=(012)=1=b1;
t2|t3=(112)|(102)=(112)=3=a2 and t2&t3=(112)&(102)=(102)=2=b2;
t3|t4=(102)|(002)=(102)=2=a3 and t3&t4=(102)&(002)=(002)=0=b3.
In the second example there is no such sequence.

题解: 位运算一个性质
a | b = c
a ^ b = d
已知a,c,d ,求b        b = c + d - a

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n,flag,a[N],b[N],res[N];
int main(){
    ios :: sync_with_stdio(false);cin.tie(0);cin >> n;for(int i = 0;i < n - 1;i++) cin >> a[i];for(int i = 0;i < n - 1;i++) cin >> b[i];for(int i = 0;i <= 3;i++){
    res[0] = i,flag = true;for(int j = 1;j < n;j++){
    res[j] = if((res[j] | res[j - 1]) != a[j - 1] || (res[j] & res[j - 1]) != b[j - 1]){
    flag = false;break;}}if(flag == true){
    cout << "YES" << endl;for(int j = 0;j < n;j++) cout << res[j] << " ";return 0;}}cout << "NO" << endl;return 0;
}