Submission #1158503

#TimeUsernameProblemLanguageResultExecution timeMemory
1158503KawakiMeidoSwap (BOI16_swap)C++20
0 / 100
5 ms9792 KiB
/*Author: KawakiMeido*/ #include <bits/stdc++.h> #define pb push_back #define endl "\n" #define ll long long #define all(x) (x).begin(),(x).end() #define pii pair<int,int> #define piii pair<int,pii> #define fi first #define se second using namespace std; /*Constants*/ const int N = 2e5+10; const int INF = 1e9+7; const long long LLINF = 1e18+3; /*TestCases*/ int test=1; void solve(); void TestCases(bool v){ if (v) cin >> test; while(test--) solve(); } /*Global Variables*/ int n; int a[N], ans[N]; vector<piii> dp[N*2]; void DFS(int u){ int val0 = INF, val1 = INF; if (u*2 <= n){ DFS(u*2); val0 = a[u*2]; } if (u*2+1<=n){ DFS(u*2+1); val1 = a[u*2+1]; } if (val0 == INF && val1 == INF){ dp[u].push_back({n+1,{u,-1}}); return; } if (val0 < val1){ vector<piii>& dp0 = dp[u*2]; int initval = val0; int idx0 = 0; while (idx0!=(int)dp0.size() && dp0[idx0].fi < initval) ++ idx0; dp[u].push_back({initval,{u,-1}}); while (idx0!=(int)dp0.size()){ dp[u].push_back({dp0[idx0].fi,{dp0[idx0].se.fi,0}}); ++idx0; } } else{ vector<piii>& dp0 = dp[u*2]; vector<piii>& dp1 = dp[u*2+1]; int midval = max(val0,val1); int initval = min(val0,val1); int idx0 = 0, idx1 = 0; bool changed = false; while (idx0!=(int)dp0.size() && dp0[idx0].fi < initval) ++ idx0; while (idx1!=(int)dp1.size() && dp1[idx1].fi < initval) ++ idx1; dp[u].push_back({initval,{u,-1}}); while (!(idx0==(int)dp0.size() || idx1==(int)dp1.size())){ int mnpos = min({dp0[idx0].fi,dp1[idx1].fi}); if (!changed) mnpos = min(mnpos,midval); pii tmpval0 = {dp0[idx0].se.fi,0}, tmpval1 = {dp1[idx1].se.fi,1}; pii mnval = (changed)? max(tmpval0,tmpval1): min(tmpval0,tmpval1); dp[u].push_back({mnpos,mnval}); if (mnpos == midval){ changed = true; } else if (mnpos == dp0[idx0].fi){ ++idx0; } else{ ++idx1; } } } } void Trace(int u, int val){ piii tmp = {val,{INF,INF}}; int pos = upper_bound(all(dp[u]),tmp) - dp[u].begin(); if (dp[u][pos].se.se == -1){ ans[u] = val; if (u*2 <= n) Trace(u*2,a[u*2]); if (u*2+1 <= n) Trace(u*2+1,a[u*2+1]); } else if (dp[u][pos].se.se == 0){ ans[u] = min(a[u*2],a[u*2+1]); if (u*2 <= n) Trace(u*2,val); if (u*2+1 <= n) Trace(u*2+1,max(a[u*2],a[u*2+1])); } else{ ans[u] = min(a[u*2],a[u*2+1]); if (u*2 <= n) Trace(u*2,max(a[u*2],a[u*2+1])); if (u*2+1 <= n) Trace(u*2+1,val); } } /*Solution*/ void solve(){ cin >> n; for (int i=1; i<=n; i++){ cin >> a[i]; } DFS(1); Trace(1,a[1]); for (int i=1; i<=n; i++){ cout << ans[i] << " "; } } /*Driver Code*/ signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); TestCases(0); return 0; }
#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...