Submission #1139929

#TimeUsernameProblemLanguageResultExecution timeMemory
1139929nathan4690Broken Device (JOI17_broken_device)C++20
100 / 100
20 ms1584 KiB
#include "Annalib.h"
#include <bits/stdc++.h>
using namespace std;

void Anna( int N, long long X, int K, int P[] ){
    vector<int> cnt(N / 3, 0);
    vector<bool> flag(N, false);
    for(int i=0;i<K;i++) {
        cnt[P[i] % (N / 3)]++;
        flag[P[i]] = true;
    }
    int idx = 0;
    for(int i=0;i<N/3;i++){
        int p1 = i, p2 = N / 3 + i, p3 = N / 3 * 2 + i;
        if(cnt[i] == 0 && idx < 59){
            long long val = (X >> (idx + 1) & 1) * 2 + (X >> idx & 1);
            if(val == 0){
                Set(p1, 1); Set(p2, 0); Set(p3, 1);
            }else if(val == 1){
                Set(p1, 0); Set(p2, 1); Set(p3, 1);
            }else if(val == 2){
                Set(p1, 1); Set(p2, 0); Set(p3, 0);
            }else{
                Set(p1, 1); Set(p2, 1); Set(p3, 1);
            }
            idx+=2;
        }else if(cnt[i] <= 1 && idx < 60){
            if(X >> idx & 1){
                if(flag[p3]){
                    Set(p1, 1); Set(p2, 1); Set(p3, 0);
                }else{
                    Set(p1, 0); Set(p2, 0); Set(p3, 1);
                }
            }else{
                if(flag[p2]){
                    if(X >> (idx + 1) & 1){
                        Set(p1, 1); Set(p2, 0); Set(p3, 0);
                    }else{
                        Set(p1, 1); Set(p2, 0); Set(p3, 1);
                    }
                    idx += 2;
                    continue;
                }
                Set(p1, 0); Set(p2, 1); Set(p3, 0);
            }
            idx++;
        }else{
            Set(i, 0); Set(N / 3 + i, 0); Set(N / 3 * 2 + i, 0);
        }
    }
}
#include "Brunolib.h"

long long Bruno( int N, int A[] ){
    long long res = 0, base = 1;
    for(int i=0;i<N/3;i++){
        int val = 0;
        for(int j=i;j<N;j+=N/3){
            val = val * 2 + A[j];
        }
        if(val == 0b111){
            res += 3 * base;
            base <<= 2;
        }
        if(val == 0b100){
            res += 2 * base;
            base <<= 2;
        }
        if(val == 0b101) base <<= 2;
        if(val == 0b010) base <<= 1;
        if(val == 0b110 || val == 0b001) {res += base; base <<= 1;}
        if(val == 0b011) {res += base; base <<= 2;}
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...