Submission #1204037

#TimeUsernameProblemLanguageResultExecution timeMemory
1204037Ghulam_JunaidBroken Device (JOI17_broken_device)C++20
0 / 100
2009 ms1344 KiB
#include <bits/stdc++.h>
#include "Annalib.h"
using namespace std;

typedef long long ll;

int p, i, b;
char nxt[3];
map<int, string> put;
map<string, int> rev;

void solve(int allowed){
    if (allowed & 3 == 0){
        Set(i, 0), i++;
        Set(i, 0), i++;
        return ;
    }

    string tmp;
    tmp += nxt[0], tmp += nxt[1];
    int mask = rev[tmp];
    if (mask & allowed == mask){
        b += 2;
        for (char c : tmp)
            Set(i, c - '0'), i++;
        return;
    }

    tmp = nxt[0];
    mask = rev[tmp];
    if (mask & allowed == mask){
        b += 1;
        for (char c : tmp)
            Set(i, c - '0'), i++;
        return;
    }

    Set(i, 0), i++;
    Set(i, 0), i++;
}

void Anna(int n, ll X, int m, int pos[] ){
    put[2] = "010";
    put[3] = "011";
    put[4] = "100";
    put[5] = "101";
    put[6] = "110";
    put[7] = "111"; 

    rev["1"] = 2;
    rev["10"] = 3;
    rev["0"] = 4;
    rev["01"] = 5;
    rev["00"] = 6;
    rev["11"] = 7;

    p = i = b = 0;
    while (i < n){
        if (b >= 60){
            Set(i, 0), i++;
            continue;
        }
        nxt[0] = '0' + !!((1ll << b) & X);
        nxt[1] = '0' + !!((1ll << (b + 1)) & X);
        nxt[2] = '0' + !!((1ll << (b + 2)) & X);
        
        while (p < m and pos[p] < i)
            p++;

        int blocked = 0;
        for (int pp = p; pp < m; pp++){
            if (pos[pp] > i + 2) break;
            blocked += (1 << (pos[pp] - i));
        }
        solve(7 - blocked);
    }
}
#include <bits/stdc++.h>
#include "Brunolib.h"
using namespace std;

typedef long long ll;

ll Bruno(int N, int A[]){
    map<string, string> rev;
    rev["010"] = "1";
    rev["011"] = "10";
    rev["100"] = "0";
    rev["101"] = "01";
    rev["110"] = "00";
    rev["111"] = "11"; 

    int i = 0;
    int b = 0;
    ll x = 0;
    while (i < N){
        if (b >= 60)
            return x;
        if (!A[i] and !A[i + 1]){
            i += 2;
            continue;
        }

        string tmp;
        for (int pp = i; pp < i + 2; pp ++)
            tmp += A[i] + '0';

        string B = rev[tmp];
        for (char c : B){
            x += (1ll << (b)) * (c - '0');
            b++;
        }
    }
    return x;
}
#Verdict Execution timeMemoryGrader output
Fetching results...