Submission #1325461

#TimeUsernameProblemLanguageResultExecution timeMemory
1325461miraiyaAncient Machine (JOI21_ancient_machine)C++20
100 / 100
42 ms6948 KiB
#include <bits/stdc++.h>
using namespace std;

using ull = unsigned long long;

void Send(int a);

void Anna(int N, vector<char> S) {
    ull fib[64];
    fib[0] = 1;
    fib[1] = 2;
    for (int i = 2; i < 64; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    vector<int> A(N, 0);
    bool fx = true;
    S.push_back('A');
    bool flag = false;
    for (int i = 0; i < N; i++) {
        if (S[i] == 'X' && fx) {
            A[i] = 1;
            fx = false;
            flag = (S[i + 1] == 'Z');
        } else if (!fx && S[i] == 'Z' && S[i + 1] != 'Z' && A[i - 1] == 0) {
            A[i] = 1;
        } 
    }

    while (A.size() % 63) {
        A.push_back(0);
    }

    for (int i = 0; i < A.size(); i += 63) {
        ull rank = 0;
        for (int j = 0; j < 63; j++) {
            if (A[i + j]) {
                rank += fib[62 - j];
            }
        }
        for (int j = 0; j < 44; j++) {
            Send(rank >> j & 1);
        }
    }
    Send(flag);
}
#include <bits/stdc++.h>
using namespace std;

void Remove(int d);

using ull = unsigned long long;

void Bruno(int N, int L, std::vector<int> A) {
    L--;
    bool flag = A.back();
    ull fib[65];
    fib[0] = 1;
    fib[1] = 2;
    for (int i = 2; i < 65; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    vector<int> B;
    for (int i = 0; i < L; i += 44) {
        ull rank = 0;
        for (int j = 0; j < 44; j++) {
            if (A[i + j]) {
                rank |= 1ull << j;
            }
        }
        for (int j = 0; j < 63; j++) {
            if (rank >= fib[62 - j]) {
                B.push_back(1);
                rank -= fib[62 - j];
            } else {
                B.push_back(0);
            }
        }
    }

    while (B.size() > N) {
        B.pop_back();
    }

    A = B;
    // for (int i = 0; i < N; i++) {
    //     cout << A[i] << " ";
    // }
    int pos = -1;
    for (int i = 0; i < N; i++) {
        if (A[i] == 1) {
            pos = i;
            break;
        }
    }
    if (pos == -1) {
        for (int i = 0; i < N; i++) {
            Remove(i);
        }
        return;
    }

    vector<bool> del(N, false);
    if (flag) {
        Remove(pos + 1);
        del[pos + 1] = true;
    }
    stack<int> st;
    for (int i = pos + 1 + flag; i < N; i++) {
        if (A[i] == 1) {
            while (st.size()) {
                Remove(st.top());
                del[st.top()] = true;
                st.pop();
            }
            Remove(i);
            del[i] = true;
        } else {
            st.push(i);
        }
    }
    for (int i = 0; i < N; i++) {
        if (!del[i]) {
            Remove(i);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...