Submission #442708

#TimeUsernameProblemLanguageResultExecution timeMemory
442708vanicMechanical Doll (IOI18_doll)C++14
83.75 / 100
122 ms14404 KiB
#include "doll.h" #include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <stack> using namespace std; const int maxn=1e5+5, Log=17, pot=(1<<Log), inf=1e9; vector < int > sus[maxn]; vector < int > vez; vector < int > x, y; int m, n; vector < int > red; bool crna[pot]; void napravi(int bit){ int br=0; for(int i=0; i<(1<<bit); i++){ red.push_back(br); for(int j=bit-1; j>-1; j--){ if((1<<j)&br){ br-=(1<<j); } else{ br+=(1<<j); break; } } } /* for(int i=0; i<red.size(); i++){ cout << red[i] << ' '; } cout << endl;*/ } int bit; int poz; int mini; int tren; struct Logaritamska{ vector < int > l; int siz; void precompute(int sz){ siz=sz; l.clear(); while(sz--){ l.push_back(0); } } void update(int x, int val){ for(; x<siz; x+=(x & -x)){ l[x]+=val; } } int query(int x){ int sol=0; for(; x>0; x-=(x & -x)){ sol+=l[x]; } return sol; } }; Logaritamska L; int siri(int cor, int val, int dep, int pos){ if(bit==dep){ // cout << red[cor] << endl; if(L.query(red[cor])==L.query(red[cor]-1)){ int ind=red[cor]-L.query(red[cor]); return sus[tren][ind]; } else{ return inf; } } int a, b; x.push_back(0); y.push_back(0); mini=min(mini, val); a=siri(cor, val-1, dep+1, pos); b=siri(cor+(1<<(bit-dep-1)), mini-1, dep+1, pos); if(a==inf && b==inf){ x.pop_back(); y.pop_back(); if(mini==val){ mini++; } return inf; } if(b==inf){ b=pos; } else if(a==inf){ a=pos; } x[-1-val]=a; y[-1-val]=b; return val; } void rijesi(){ int br; int pos=-1; int raz; int iduca; for(int i=1; i<=m; i++){ // cout << "usao" << endl; tren=i; if(sus[i].empty()){ vez.push_back(0); } else if(sus[i].size()==1){ vez.push_back(sus[i][0]); } else{ br=1; bit=0; while((int)sus[i].size()>br){ br*=2; bit++; } red.clear(); napravi(bit); L.precompute(br); raz=br-sus[i].size(); iduca=1; while(iduca<=raz){ iduca*=2; } for(int j=br-raz-1; j<br-1; j++){ // cout << "ne " << red[j] << endl; L.update(red[j], 1); } vez.push_back(siri(0, pos, 0, pos)); pos=mini-1; } } } void create_circuit(int M, vector <int> a){ m=M; n=a.size(); a.push_back(0); vez.push_back(a[0]); for(int i=0; i<n; i++){ sus[a[i]].push_back(a[i+1]); } rijesi(); /* for(int i=0; i<(int)vez.size(); i++){ cout << vez[i] << ' '; } cout << endl; for(int i=0; i<(int)x.size(); i++){ cout << x[i] << ' ' << y[i] << endl; }*/ answer(vez, 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...