Submission #776040

#TimeUsernameProblemLanguageResultExecution timeMemory
776040phoenixMechanical Doll (IOI18_doll)C++17
53 / 100
94 ms19336 KiB
#include<bits/stdc++.h>
#include "doll.h"

using namespace std;

vector<int> A, C, X, Y;
int S = 0;

int create_switch() {
    X.push_back(-1);
    Y.push_back(-1);
    S++;
    return -S;    
}

void build(int trigger, vector<int> in) {
    if((int)in.empty()) {
        C[trigger] = 0;
        return;
    }
    if((int)in.size() == 1) {
        C[trigger] = A[in[0] + 1];
        return;
    }
    int k = 1;
    vector<int> order = {0}; 
    while(k < (int)in.size()) {
        if(k == 1) C[trigger] = create_switch();
        else {
            int len = S;
            for(int i = len - k / 2; i < len; i++) {
                X[i] = create_switch();
                Y[i] = create_switch();
            }
        }
        vector<int> new_ord;
        for(int i = 0; i < k; i++) 
            new_ord.push_back(order[i]),
            new_ord.push_back(order[i] + k);
        order = new_ord;
        k *= 2;
    }
    for(int i = S - k / 2; i < S; i++) {
        int y = i - S + k / 2;
        X[i] = (order[y * 2] < k - (int)in.size() ? C[trigger] : A[in[ order[2 * y] - k + (int)in.size() ] + 1]);
        Y[i] = (order[y * 2 + 1] < k - (int)in.size() ? C[trigger] : A[in[ order[2 * y + 1] - k + (int)in.size() ] + 1]);
    }
}

void build1() {
    int k = 1;
    vector<int> order = {0}; 
    while(k < (int)A.size()) {
        if(k == 1) C[0] = create_switch();
        else {
            int len = S;
            for(int i = len - k / 2; i < len; i++) {
                X[i] = create_switch();
                Y[i] = create_switch();
            }
        }
        vector<int> new_ord;
        for(int i = 0; i < k; i++) 
            new_ord.push_back(order[i]),
            new_ord.push_back(order[i] + k);
        order = new_ord;
        k *= 2;
    }
    for(int i = S - k / 2; i < S; i++) {
        int y = i - S + k / 2;
        X[i] = (order[y * 2] < k - (int)A.size() ? C[0] : A[order[2 * y] - k + (int)A.size() ]);
        Y[i] = (order[y * 2 + 1] < k - (int)A.size() ? C[0] : A[order[2 * y + 1] - k + (int)A.size() ]);
    }
}
const int N = 1e5 + 10;
vector<int> g[N];


void create_circuit(int M, std::vector<int> a) {
    C.resize(M + 1);
    a.push_back(0);
    A = a;
    int N = (int)A.size();
    if((N & N - 1) > 0) {
        for(int i = 0; i < N; i++) {
            g[A[i]].push_back(i);
        }
        C[0] = A[0];
        for(int i = 1; i <= M; i++) {
            build(i, g[i]);
        }
        answer(C, X, Y);
    } else {
        build1();
        for(int i = 1; i <= M; i++) C[i] = C[0];
        answer(C, X, Y);
    }
}
// int main() {
//     create_circuit(0, vector<int>());
// }

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:84:15: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   84 |     if((N & N - 1) > 0) {
      |             ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...