Skip to content
On this page

a62_q1b_virus.cpp

cpp
#include <cmath>
#include <iostream>
#include <vector>

std::vector<int> dna;
int n, k, len;

bool isVirus(int begin, int end, bool reverse) {
    int level = end - begin;

    if (level == 2) {
        if (!reverse) {
            return dna[begin] == 0 && dna[begin + 1] == 1;
        } else {
            return dna[begin + 1] == 0 && dna[begin] == 1;
        }
    }

    int mid = (begin + end) / 2;

    if (!reverse) {
        return (isVirus(begin, mid, false) || isVirus(begin, mid, true)) &&
               isVirus(mid, end, false);
    } else {
        return (isVirus(mid, end, false) || isVirus(mid, end, true)) &&
               isVirus(begin, mid, true);
    }
}

void solve() {
    for (int i = 0; i < len; i++) {
        std::cin >> dna[i];
    }

    std::cout << (isVirus(0, len, false) ? "yes" : "no") << "\n";
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::cin >> n >> k;
    len = std::pow(2, k);

    dna = std::vector<int>(len);

    while (n--) {
        solve();
    }
}

See on GitHub

Last Updated: 23/11/2566 13:54:12 (UTC+7)

Released under the MIT License