Submission #442856

#TimeUsernameProblemLanguageResultExecution timeMemory
442856vanicMechanical Doll (IOI18_doll)C++14
100 / 100
108 ms13104 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 > vez; vector < int > x, y; int m, n; vector < int > red; 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; vector < int > A; int siri(int cor, int val, int dep, int pos){ if(bit==dep){ // cout << red[cor] << endl; if(L.query(red[cor]+1)==L.query(red[cor])){ int ind=red[cor]-L.query(red[cor]); return A[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 raz; br=1; bit=0; for(int i=0; i<m+1; i++){ vez.push_back(-1); } while((int)A.size()>br){ br*=2; bit++; } red.clear(); napravi(bit); L.precompute(br+5); raz=br-A.size(); for(int j=0; j<raz; j++){ L.update(red[j]+1, 1); } siri(0, -1, 0, -1); } void create_circuit(int M, vector <int> a){ m=M; n=a.size(); a.push_back(0); A=a; 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...