Submission #375303

#TimeUsernameProblemLanguageResultExecution timeMemory
375303Mamnoon_SiamSwap (BOI16_swap)C++17
68 / 100
886 ms262148 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ii = pair<int, int>; using vi = vector<int>; #define all(v) begin(v), end(v) #define sz(v) (int)(v).size() #define fi first #define se second const int N = 4e5 + 3; map<int, vi> dp[N]; int a[N], n, nn; vi todo[N]; vi merge(vi& p, vi& q, int x) { vi r; r.reserve(sz(p)+sz(q)+1); r.emplace_back(x); int pw = 1; int i = 0, j = 0; while(i < sz(p) or j < sz(q)) { r.insert(r.end(), p.begin()+i, p.begin()+min(sz(p), i+pw)); r.insert(r.end(), q.begin()+j, q.begin()+min(sz(q), j+pw)); i = min(i+pw, sz(p)); j = min(j+pw, sz(q)); pw *= 2; } return r; } int main(int argc, char* argv[]) { cin.sync_with_stdio(0); cin.tie(0); cin.exceptions(cin.failbit); #ifdef LOCAL freopen("in", "r", stdin); #endif cin >> n; nn = 1; while(nn-1 < n) nn *= 2; nn--; for(int i = 1; i <= n; ++i) cin >> a[i]; for(int i = n+1; i <= nn; ++i) a[i] = n+1; for(int i:{1,2,3}) if(i <= nn) todo[1].emplace_back(a[i]); sort(all(todo[1])); todo[1].erase(unique(all(todo[1])), todo[1].end()); for(int i = 2; i <= nn; ++i) { for(int j:{i,2*i,2*i+1}) if(j <= nn) todo[i].emplace_back(a[j]); int u = i; while(u != 1) { if(u & 1) { todo[i].emplace_back(a[u^1]); } todo[i].emplace_back(a[u>>1]); u >>= 1; } sort(all(todo[i])); todo[i].erase(unique(all(todo[i])), todo[i].end()); } for(int i = nn/2+1; i <= nn; ++i) { for(int x : todo[i]) dp[i][x] = {x}; } for(int u = nn/2; u >= 1; --u) { for(int k : todo[u]) { vi& ret = dp[u][k]; { // don't use any edge vi& l = dp[2*u][a[2*u]]; vi& r = dp[2*u+1][a[2*u+1]]; ret = merge(l, r, k); } { // use only left edge vi& l = dp[2*u][k]; vi& r = dp[2*u+1][a[2*u+1]]; vi tmp = merge(l, r, a[2*u]); ret = min(ret, tmp); } { // use only right edge vi& l = dp[2*u][a[2*u]]; vi& r = dp[2*u+1][k]; vi tmp = merge(l, r, a[2*u+1]); ret = min(ret, tmp); } { // use both edges vi& l = dp[2*u][k]; vi& r = dp[2*u+1][a[2*u]]; vi tmp = merge(l, r, a[2*u+1]); ret = min(ret, tmp); } } dp[2*u].clear(); dp[2*u+1].clear(); } vi ans = dp[1][a[1]]; for(int i = 0; i < n; ++i) cout << ans[i] << ' '; cout << endl; }
#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...