Submission #1229911

#TimeUsernameProblemLanguageResultExecution timeMemory
1229911Ghulam_JunaidZalmoxis (BOI18_zalmoxis)C++20
25 / 100
889 ms308672 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e6 + 10, LG = 31; int n, k, rep[N], sz; vector<int> S[N]; int root(int v){ return (rep[v] ? rep[v] = root(rep[v]) : v); } void merge(int u, int v){ if ((u = root(u)) == (v = root(v))) return ; rep[u] = v; for (int x : S[u]) S[v].push_back(x); S[u].clear(); } struct node{ int val, mn_ind, par, lc, rc; node(){ val = mn_ind = par = lc = rc = -1; } } a[N]; void work(int x){ if (k == 0 or a[x].val == 0) return ; k++; a[sz].val = a[x].val - 1; a[sz].par = x; sz++; a[sz].val = a[x].val - 1; a[sz].par = x; sz++; a[x].lc = sz - 2, a[x].rc = sz - 1; k -= 2; work(a[x].lc); work(a[x].rc); } vector<int> path; void dfs(int v){ if (a[v].lc == -1){ path.push_back(a[v].val); return ; } dfs(a[v].lc); dfs(a[v].rc); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k; for (int i = 1; i <= n; i ++){ cin >> a[i].val; a[i].mn_ind = i; S[i] = {i}; } sz = n + 1; for (int cur = 0; cur < 30; cur ++){ // cout << ":: " << cur << endl; for (int i = 2; i <= n; i ++) if (a[i].val <= cur and a[i - 1].val <= cur) merge(i, i - 1); // cout << cur << " :: " << sz << endl; int last = -1; for (int i = 1; i <= n; i ++){ int r = root(i); if (r == last) continue; last = r; vector<pair<int, int>> vec; for (int x : S[r]){ // cout << r << " contains " << x << " which is " << a[x].val << endl; if (a[x].val == cur) vec.push_back({a[x].mn_ind, x}); } sort(vec.begin(), vec.end()); if (vec.size() % 2){ // cout << "HERE" << endl; vec.push_back({sz, sz}); a[sz].val = cur, a[sz].mn_ind = sz; S[sz] = {sz}; merge(sz, r); sz++; k--; } for (int j = 0; j < vec.size(); j += 2){ int x = vec[j].second, y = vec[j + 1].second; // cout << cur << " : " << x << " " << y << endl; a[sz].val = cur + 1; a[sz].lc = x, a[sz].rc = y; a[sz].mn_ind = min(a[x].mn_ind, a[y].mn_ind); a[x].par = sz, a[y].par = sz; S[sz] = {sz}; merge(sz, r); sz++; } } // cout << cur << " :: " << sz << endl; } // cout << "Done" << endl; // cout << k << endl; assert(k >= 0); for (int i = n + 1; i < sz; i ++){ if (a[i].lc != -1) continue; work(i); } // cout << "work done" << endl; int r; for (int i = 1; i < sz; i ++) if (a[i].val == 30) r = i; // cout << "Root = " << r << endl; dfs(r); for (int x : path) cout << x << " "; cout << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...