Submission #525093

#TimeUsernameProblemLanguageResultExecution timeMemory
525093leakedMechanical Doll (IOI18_doll)C++14
53 / 100
149 ms16656 KiB
#include <bits/stdc++.h>
#include "doll.h"


#define f first
#define s second
#define m_p make_pair
#define vec vector
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define sz(x) (int)(x).size()
#define pw(x) (1LL<<(x))

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

void create_circuit(int m,vec<int> a){
    vec<int>c(m+1);
    vec<int> cnt(m+1,0);
    vec<vec<int>> goes(m+1,vec<int>());
    int n=0;
    for(int i=0;i<sz(a);i++){
        int nxt=(i+1==sz(a)?0:a[i+1]);
        goes[a[i]].pb(nxt);
    }
    vec<int>x,y;
    vec<int>curt;
    for(int i=1;i<=m;i++){
        if(sz(goes[i])==1){
            c[i]=goes[i].back();
            continue;
        }
        if(!sz(goes[i])) continue;
        vec<int>cur(sz(goes[i]),0);
        int lvl=ceil((double)log2(sz(goes[i])));
        int lt=lvl;
        while(sz(cur)!=pw(lvl)) cur.pb(0);
        while(lvl!=0){
            vec<int>nc;
            for(int j=0;j<sz(cur);j+=2){
                nc.pb(-(++n));
//                cout<<"EDGE "<<nc.back()<<' '<<cur[j]<<' '<<cur[j+1]<<endl;
                x.pb(cur[j]);y.pb(cur[j+1]);
                curt.pb(0);
            }
            cur=nc;
            --lvl;
        }
        reverse(all(goes[i]));
        lvl=lt;
//        if(i==4){
//            i=4;
//        }
        while(sz(goes[i])!=pw(lvl)) goes[i].pb(cur.back());
        while(sz(goes[i])){
            int v=cur.back();
            while(1){
                v=-v;
//                cout<<"V "<<v<<' '<<sz(x)<<endl;
                int &u=(curt[v-1]?y[v-1]:x[v-1]);
                curt[v-1]^=1;
                if(u>=0){
                    u=goes[i].back(),goes[i].pop_back();
                    break;
                }
                v=u;
            }
        }
        c[i]=cur.back();
    }
    c[0]=a[0];
//        cout<<sz(c)<<' '<<sz(x)<<' '<<sz(y)<<endl;
//    for(auto &z : c)
//        cout<<z<<' ';
//    cout<<endl;
//    for(int i=0;i<sz(x);i++){
//        if(x[i]==y[i]){
//
//        }
//    }
//        cout<<x[i]<<' '<<y[i]<<endl;

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