Submission #940798

#TimeUsernameProblemLanguageResultExecution timeMemory
940798snpmrnhlolMechanical Doll (IOI18_doll)C++17
70.67 / 100
89 ms12372 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
void create_circuit(int m, vector<int> a) {
    int n = a.size();
    int len = 0;
    int cnt = -2;
    while((1<<len) < n + 1)len++;
    vector <int> c(m + 1);
    vector <int> x((1<<len) - 1);
    vector <int> y((1<<len) - 1);
    vector <int> x2;
    vector <int> y2;
    vector <array<int,3>> ord;
    for(int i = 0;i < m + 1;i++){
        c[i] = -1;
    }
    auto dfs = [&](auto self,int node,int d) -> void {
        if(d == len - 1){
            x[-node - 1] = -1;
            y[-node - 1] = -1;
        }else{
            x[-node - 1] = cnt--;
            self(self,cnt + 1,d + 1);
            y[-node - 1] = cnt--;
            self(self,cnt + 1,d + 1);
        }
    };
    int cnt2 = 0,last = 0;
    auto dfs2 = [&](auto self,int node,int d) -> void {
        if(d == len - 1){
            int nr = 0;
            for(int j = 0;j < len;j++){
                if(cnt2>>j&1){
                    nr|=(1<<(len - j - 1));
                }
            }
            if(cnt2 < n)ord.push_back({nr,node,0});
            cnt2++;
            if(cnt2 < n)ord.push_back({nr + (1<<len),node,1});
            cnt2++;
            last = node;
        }else{
            self(self,-x[node] - 1,d + 1);
            self(self,-y[node] - 1,d + 1);
        }
    };
    auto dfs3 = [&](auto self,int node,int d) -> int {
        if(d == len - 1){
            if(x[node] == -1 && y[node] == -1){
                return -1;
            }else{
                x2.push_back(x[node]);
                y2.push_back(y[node]);
                return x2.size() - 1;
            }
        }else{
            if(node == 0){
                x2.push_back(0);
                y2.push_back(0);
            }
            int l = self(self,-x[node] - 1,d + 1);
            int r = self(self,-y[node] - 1,d + 1);
            if(l == -1 && r == -1)return -1;
            else{
                if(node == 0){
                    if(l != -1){
                        x2[0] = -l - 1;
                    }else x2[0] = -1;
                    if(r != -1){
                        y2[0] = -r - 1;
                    }else y2[0] = -1;
                }else{
                    if(l != -1){
                        x2.push_back(-l - 1);
                    }else x2.push_back(-1);
                    if(r != -1){
                        y2.push_back(-r - 1);
                    }else y2.push_back(-1);
                }
                return x2.size() - 1;
            }
        }
    };
    dfs(dfs,-1,0);
    dfs2(dfs2,0,0);
    int cnt3 = 0;
    sort(ord.begin(),ord.end());
    for(auto i:ord){
        if(i[2] == 0){
            x[i[1]] = a[cnt3];
        }else{
            y[i[1]] = a[cnt3];
        }
        cnt3++;
    }
    y[last] = 0;
    /*for(int i = 0;i < (1<<len) - 1;i++){
        cout<<x[i]<<' '<<y[i]<<'\n';
    }*/
    dfs3(dfs3,0,0);
    /*for(int i = 0;i < x2.size();i++){
        cout<<x2[i]<<' '<<y2[i]<<'\n';
    }*/
    return answer(c,x2,y2);
}
/**
5 4
1 2 3 1
**/
#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...