Submission #289047

#TimeUsernameProblemLanguageResultExecution timeMemory
289047fishy15Broken Device (JOI17_broken_device)C++14
100 / 100
73 ms3144 KiB
#include "Annalib.h"
#include <vector>
using namespace std;

void Anna(int N, long long X, int K, int P[]) {
    vector<bool> works(N, true);
    vector<bool> toset(N, false);
    
    for (int i = 0; i < K; i++) {
        works[P[i]] = false;
    }

    for (int i = 0; i < N; i += 3) {
        int cnt = works[i] + works[i + 1] + works[i + 2];
        if (cnt == 3) {
            int v = X % 4;
            if (v == 0) {
                toset[i] = 1;
            } else if (v == 1) {
                toset[i + 1] = 1;
                toset[i + 2] = 1;
            } else if (v == 2) {
                toset[i] = 1;
                toset[i + 2] = 1;
            } else {
                toset[i] = 1;
                toset[i + 1] = 1;
                toset[i + 2] = 1;
            }
            X >>= 2;
        } else if (cnt == 2) {
            if (!works[i]) {
                if (X & 1) {
                    toset[i + 2] = 1;
                } else {
                    toset[i + 1] = 1;
                }
                X >>= 1;
            } else if (!works[i + 1]) {
                if (X & 1) {
                    toset[i + 2] = 1;
                    X >>= 1;
                } else {
                    if (X % 4 == 0) {
                        toset[i] = 1;
                    } else {
                        toset[i] = 1;
                        toset[i + 2] = 1;
                    }
                    X >>= 2;
                }
            } else {
                if (X & 1) {
                    toset[i] = 1;
                    toset[i + 1] = 1;
                } else {
                    toset[i + 1] = 1;
                }
                X >>= 1;
            }
        }
    }

    for (int i = 0; i < N; i++) {
        Set(i, toset[i]);
    }
}
#include "Brunolib.h"
#define ll long long

long long Bruno(int N, int A[]){
    int d = 0;
    ll ans = 0;

    for (int i = 0; i < N; i += 3) {
        if (d > 60) break;
        int v = 4 * A[i] + 2 * A[i + 1] + A[i + 2];
        if (v == 1) {
            ans += 1LL << d;
            d++;
        } else if (v == 2) {
            d++;
        } else if (v == 3) {
            ans += 1LL << d;
            d += 2;
        } else if (v == 4) {
            d += 2;
        } else if (v == 5) {
            ans += 2LL << d;
            d += 2;
        } else if (v == 6) {
            ans += 1LL << d;
            d++;
        } else if (v == 7) {
            ans += 3LL << d;
            d += 2;
        }
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...