Submission #867507

#TimeUsernameProblemLanguageResultExecution timeMemory
867507bibinmZalmoxis (BOI18_zalmoxis)C++17
0 / 100
153 ms100276 KiB
#include <bits/stdc++.h> using namespace std; struct node{ int val; node* prev = nullptr; node* next = nullptr; node* left = nullptr; node* right = nullptr; }; vector<int> result; int to_add; void dfs(node* v){ //cout << v->val << " " << to_add << "\n"; if(v->left == nullptr and v->right == nullptr){ if(to_add == 0 || v->val == 0){ result.push_back(v->val); return; } node* copy_left = new node(); copy_left->val = v->val - 1; node* copy_right = new node(); copy_right->val = v->val - 1; v->left = copy_left; v->right = copy_right; to_add -= 1; } if(v->left != nullptr) dfs(v->left); if(v->right != nullptr) dfs(v->right); } signed main(){ int n, k; cin >> n >> k; vector<node> seq(n); for(int i = 0; i < n; i++){ cin >> seq[i].val; seq[i-1].next = &seq[i]; seq[i].prev = &seq[i-1]; } node* sentinel_begin = new node(); sentinel_begin->val = 100; sentinel_begin->next = &seq[0]; seq[0].prev = sentinel_begin; node* sentinel_end = new node(); sentinel_end->val = 101; sentinel_end->prev = &seq.back(); seq.back().next = sentinel_end; int count_ins = 0; node* cur = &seq[0]; while(cur->val != 30){ while(cur->next != sentinel_end or cur->prev != sentinel_begin){ //cout << cur->prev->val << " " << cur->val << " " << cur->next->val << " | "; if(cur->prev->val <= cur->val){ //cout << ".:\n"; cur = cur->prev; continue; } // :. is guaranteed if(cur->val > cur->next->val){ //cout << ":.\n"; cur = cur->next; continue; } // need a new node node* mid = new node(); mid->val = cur->val + 1; // :.: if(cur->prev->val > cur->val and cur->val < cur->next->val){ // insert operation //cout << ":.:\n"; count_ins += 1; node* copy_cur = new node(); copy_cur->val = cur->val; mid->left = cur; mid->right = copy_cur; mid->prev = cur->prev; mid->prev->next = mid; mid->next = cur->next; mid->next->prev = mid; } // :.. if(cur->prev->val > cur->val and cur->val == cur->next->val){ //cout << ":..\n"; mid->left = cur; mid->right = cur->next; mid->prev = cur->prev; mid->prev->next = mid; mid->next = cur->next->next; mid->next->prev = mid; } cur = mid; continue; // ..: (cannot happen) } //cout << "E: " << cur->val << endl; if(cur->val == 30) break; node* copy_node = new node(); copy_node->val = cur->val; copy_node->next = cur->next; copy_node->next->prev = copy_node; copy_node->prev = cur; copy_node->prev->next = copy_node; count_ins += 1; } //cout << "A" << endl; to_add = k - count_ins; dfs(cur); //cout << "B" << endl; for(int &r: result) cout << r << " "; cout << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...