Submission #297175

#TimeUsernameProblemLanguageResultExecution timeMemory
297175amiratou자동 인형 (IOI18_doll)C++14
53 / 100
204 ms20444 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
const int MX = (int)(1e5+5);
#define sz(x) (int)(x.size())

int log_2(int x){
    return 31-__builtin_clz(x);
}
vector<int> occ[MX],C;
bool state[4*MX],last[4*MX];
int idx=1,X[4*MX],Y[4*MX],a[2*MX];
// fix indexes 2*i is wrong, must assign indexes dynamically 
void gimme(int x){
    //sz(oc[x])==1
    int nb=(1<<(log_2(sz(occ[x])-1)+1))-1;
    int sum=0,st=idx+1,comp=0;
    vector<int> vec={idx};
    while((sum+sz(vec))< nb){
        vector<int> G;
        for(auto it:vec){
            X[it]=-st;
            G.push_back(st),st++;
            Y[it]=-st;
            G.push_back(st),st++;
        }
        sum+=sz(vec);
        vec=G;
    }
    C[x]=-idx;
    for (int i = idx; i <= idx+nb-1; ++i)
        last[idx]=0;
    for(auto it:vec)
        last[it]=1;
    for (int i = 0; i < nb+1; ++i)
    {
        int r=-idx;
        while(!last[-r]){
            state[-r]=(!state[-r]);
            if(state[-r])r=X[-r];
            else r=Y[-r];
        }
        if((nb-i)<sz(occ[x])){
            /*cerr<<-r<<" ";
            cerr<<a[occ[x][comp]+1]<<"\n";*/
            //cerr<<nb-i<<"\n";
            if(!state[-r])X[-r]=a[occ[x][comp]+1];
            else Y[-r]=a[occ[x][comp]+1];
            comp++;
        }
        else {
            if(!state[-r])X[-r]=-idx;
            else Y[-r]=-idx;
        }
        state[-r]=(!state[-r]);
    }
    /*for (int i = idx; i <= idx+nb-1; ++i)
        cerr<<i<<" : "<<X[i]<<" "<<Y[i]<<"\n";
    */
    idx+=nb;
}

void create_circuit(int M, vector<int> A) {
    for (int i = 0; i < sz(A); ++i)
        occ[A[i]].push_back(i),a[i]=A[i];
    a[sz(A)]=0;
    A.push_back(0);
    C.resize(M+1);
    C[0]=A[0];
    for (int i = 0; i < sz(A)-1; ++i)
        if(occ[A[i]][0]==i)
            gimme(A[i]);
    vector<int> x(idx-1),y(idx-1);
    for (int i = 1; i < idx; ++i){
        x[i-1]=X[i],y[i-1]=Y[i];
    }
	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...