Submission #1034682

#TimeUsernameProblemLanguageResultExecution timeMemory
1034682LudisseyMechanical Doll (IOI18_doll)C++14
85.55 / 100
65 ms12660 KiB
#include "doll.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(x) (x).begin(), (x).end()
using namespace std;

void create_circuit(int M, std::vector<int> A){
    int N=sz(A);
    vector<int> C(M+1,0);
    vector<vector<int>> nxt(M+1);
    vector<int> X;
    vector<int> Y;
    for (int i = 1; i < N; i++)
    {
        nxt[A[i-1]].push_back(A[i]);
    }
    nxt[A[N-1]].push_back(0);
    C[0]=A[0];
    int trig=-1;
    for (int nx = 1; nx <= M; nx++)
    {
        if(sz(nxt[nx])==0) continue;
        if(sz(nxt[nx])<=1){
            C[nx]=nxt[nx][0];
        }else if(sz(nxt[nx])<=2){
            C[nx]=trig;
            trig--;
            X.push_back(nxt[nx][0]);
            Y.push_back(nxt[nx][1]);
        }else if(sz(nxt[nx])==3){
            C[nx]=trig;
            X.push_back(trig-1);
            Y.push_back(trig-2);
            X.push_back(nxt[nx][0]);
            Y.push_back(trig);
            X.push_back(nxt[nx][1]);
            Y.push_back(nxt[nx][2]);
            trig-=3;
        } 
        else if(sz(nxt[nx])==4){
            C[nx]=trig;
            X.push_back(trig-1);
            Y.push_back(trig-2);
            X.push_back(nxt[nx][0]);
            Y.push_back(nxt[nx][2]);
            X.push_back(nxt[nx][1]);
            Y.push_back(nxt[nx][3]);
            trig-=3;
        }
        else{
            int origTRIG=trig;
            C[nx]=trig;
            int logo=log2(sz(nxt[nx])*2-1);
            vector<pair<int,int>> S(logo);
            int diff=(1<<logo)-sz(nxt[nx]);
            int inventedTRIG=-1;
            int res=sz(nxt[nx]);
            while(res>0){

            }
            for (int j = 0; j < logo; j++)
            {
                if(diff&(1<<((logo-1)-j))) S[j].first=inventedTRIG;
                else S[j].first=1;
                if(j==logo-1) S[j].second=nxt[nx].back();
                else S[j].second=(inventedTRIG-1)-j;
            }

            trig--;
            vector<vector<int>> has(logo);
            vector<bool> state(logo);
            int c=0;
            int pos=-1;
            while(c<sz(nxt[nx])){
                if(state[(-pos)-1]){
                    state[(-pos)-1]=false;
                    if(-S[(-pos)-1].second<=0) {
                        has[(-pos)-1].push_back(nxt[nx][c]);
                        c++;
                        pos=-1;
                    }else{
                        pos=S[(-pos)-1].second;
                    }
                }else {
                    state[(-pos)-1]=true;
                    if(-S[(-pos)-1].first<=0) {
                        has[(-pos)-1].push_back(nxt[nx][c]);
                        c++;
                        pos=-1;
                    }
                    else{
                        pos=S[(-pos)-1].first;
                    }
                }
            }
            for (int j = 0; j < logo; j++)
            {
                int torem=sz(Y);
                int inv=((logo-1)-j);
                if(diff&(1<<inv)) {
                    if(inv==0){
                        X.push_back(origTRIG);
                        Y.push_back(has[j][0]);
                    }else{
                        X.push_back(origTRIG);
                        Y.push_back(trig); trig--;
                    }
                    continue;
                }
                if(inv==0){
                    X.push_back(has[j][0]);
                    Y.push_back(has[j][1]);
                    continue;
                }
                Y.push_back(origTRIG);
                X.push_back(trig); trig--;
                

                int c2=0;
                for (int i = 0; i < (1<<(inv-1))-1; i++)
                {
                    X.push_back(trig-c2);
                    Y.push_back(trig-(c2+1));
                    c2+=2;
                }
                trig-=c2;
                vector<int> S2(sz(has[j]));
                for (int i = 0; i < sz(has[j]); i++)
                {
                    int _i=i+1; 
                    int pos2=0;
                    int cPOW=0;
                    for (int k = inv-1; k >=0; k--)
                    {
                        if(_i>(1<<k)){
                            pos2+=(1<<cPOW);
                            _i-=(1<<k);
                        }
                        cPOW++;
                    }
                    S2[pos2]=has[j][i];
                }
                for (int i = 0; i < sz(S2); i++)
                {
                    if(i%2==0) X.push_back(S2[i]);
                    else Y.push_back(S2[i]);
                }
                Y[torem]=trig; trig--;
            }
        }
    }
    for (int i = 0; i <= M; i++)
    {
        // << C[i] << " ";
    }
    //cerr<<"\n";
    for (int i = 0; i < sz(X); i++){
        //cerr << X[i] << " " << Y[i] << "\n";
    }

    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...