Submission #756350

#TimeUsernameProblemLanguageResultExecution timeMemory
756350drdilyorMechanical Doll (IOI18_doll)C++17
6 / 100
103 ms11296 KiB
#include<bits/stdc++.h>
#include "doll.h"
using namespace std;
using ll = long long;

void create_circuit(int m, std::vector<int> arr) {
    vector<int> c(m+1);
    vector<int> x, y;
    auto add = [&](int a, int b){
        x.push_back(a), y.push_back(b);
        return -(int)x.size();
    };

    auto tree = [&](auto& tree, vector<int> nxt) {
        if (nxt.size() == 1) {
            return nxt[0];
        }
        vector<int> odd, even;
        for (int i = 0; i < (int)nxt.size(); i += 2) {
            odd.push_back(nxt[i]);
            even.push_back(nxt[i+1]);
        }
        int t1 = tree(tree, odd);
        int t2 = tree(tree, even);
        return add(t1, t2);
    };

    int n = arr.size();
    vector<vector<int>> nxt(m+1);
    arr.push_back(0);
    for (int i = 0; i < n; i++) {
        nxt[arr[i]].push_back(arr[i+1]);
    }
    for (int i = 1; i <= m; i++) {
        if (nxt[i].empty()) {
            c[i] = 0;
        } else {
            while (__builtin_popcount(nxt[i].size()) > 1)
                nxt[i].push_back(INT_MAX);
            int start = x.size();
            c[i] = tree(tree, nxt[i]);
            while (start < (int)x.size()) {
                if (x[start] == INT_MAX)
                    x[start] = c[i];
                if (y[start] == INT_MAX)
                    y[start] = c[i];
                start++;
            }
        }
    }
    c[0] = arr[0];
    answer(c, x, y);
}
#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...