Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

A. Golden Plate

水题

B. Curiosity Has No Limits(构造)

题意:给出一个长度为n-1的序列a和一个长度为n-1的序列b,问能否构造出一个长度为n的序列t,使得t(i)|t(i+1)=a(i), t(i)&t(i+1)=b(i),其中每个序列的元素都大于等于0小于等于3.

题解:首先要找到一个规律:(a&b+a|b)= (a+b)然后枚举t(1),剩下的就能确定了,每个再判断是否可行即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int n;
int a[100010], b[100010], t[100010];

int main(){
    scanf("%d", &n);
    for(int i = 1; i<=n-1; i++){
        scanf("%d", &a[i]);
    }
    for(int i = 1; i<=n-1; i++){
        scanf("%d", &b[i]);
    }
    int now = 1;
    for(int i = 0; i<=3; i++){
        t[1] = i;
        now = 1;
        for(int j = 1; j<=n-1; j++){
            int tmp = a[j]+b[j]-t[j];
            if(tmp<=3 && (t[j]|tmp) == a[j] && (t[j]&tmp) == b[j]){
                t[j+1] = tmp;
                now = j+1;
            }
            else{
                break;
            }
        }
        if(now == n){
            break;
        }
    }
    if(now == n){
        printf("YES\n");
        for(int i = 1; i<=n; i++){
            if(i!=1) printf(" ");
            printf("%d", t[i]);
        }
        printf("\n");
    }
    else{
        printf("NO\n");
    }


    return 0;
}

猜你喜欢

转载自www.cnblogs.com/grimcake/p/9843199.html
今日推荐