제출 #1000694

#제출 시각아이디문제언어결과실행 시간메모리
1000694ProtonDecay314크레이피쉬 글쓰는 기계 (IOI12_scrivener)C++17
34 / 100
544 ms262144 KiB
/* Eyoo it's a persistent dynamic array!! :D For the version history, all I need to do is to maintain a dynamic array, and then the undo command is just appending the previous state to the array */ #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vll; // For the dynamic array, I will use an INFINITE array class Array { private: char _v; Array* _odd; Array* _even; public: Array(char a_v, Array* a_odd, Array* a_even): _v(a_v), _odd(a_odd), _even(a_even) {}; char v() { return _v; } Array* odd() { if(_odd == nullptr) _odd = new Array(' ', nullptr, nullptr); return _odd; } Array* even() { if(_even == nullptr) _even = new Array(' ', nullptr, nullptr); return _even; } char get(int i) { if(i == 0) return _v; else if(i & 1) return odd()->get((i - 1) >> 1); else return even()->get((i - 1) >> 1); } Array* set(int i, char c) { if(i == 0) return new Array(c, _odd, _even); else if(i & 1) return new Array(_v, odd()->set((i - 1) >> 1, c), _even); else return new Array(_v, _odd, even()->set((i - 1) >> 1, c)); } }; class VersionedArray { private: vector<int> _sizes; vector<Array*> _stack; public: VersionedArray() {}; inline void push_version(Array* v) { _stack.push_back(v); } inline void push_size(int size) { _sizes.push_back(size); } inline int num_versions() { return _stack.size(); } inline Array* get_version(int i) { return _stack[i]; } inline Array* get_past_version(int i) { return get_version(num_versions() - i - 1); } inline Array* top() { return _stack[num_versions() - 1]; } inline int get_past_size(int i) { return _sizes[num_versions() - i - 1]; } inline int top_size() { return _sizes[num_versions() - 1]; } static VersionedArray create() { Array* first = new Array(' ', nullptr, nullptr); VersionedArray instance; instance.push_version(first); instance.push_size(0); return instance; } }; VersionedArray versions; void Init() { versions = VersionedArray::create(); } void TypeLetter(char L) { int prev_top_size = versions.top_size(); versions.push_size(prev_top_size + 1); versions.push_version(versions.top()->set(prev_top_size, L)); } void UndoCommands(int U) { versions.push_size(versions.get_past_size(U)); versions.push_version(versions.get_past_version(U)); } char GetLetter(int P) { return versions.top()->get(P); }
#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...