Submission #469437

#TimeUsernameProblemLanguageResultExecution timeMemory
469437cpp219Swap (BOI16_swap)C++14
100 / 100
859 ms233680 KiB
#include<bits/stdc++.h> #define ll int #define ld long double #define fs first #define sc second #define debug(y) cout<<y,exit(0) using namespace std; typedef pair<ll,ll> LL; const ll N = 2e5 + 9; const ll inf = 1e9 + 7; vector<ll> dp[N][18][2],tmp1,tmp2; ll n,a[N]; bool need[N][18][2]; void Merge(vector<ll> &res,vector<ll> &a,vector<ll> &b){ for (ll i = 0,j = 1;i < a.size();i += j,j *= 2){ for (ll k = i;k < i + j && k < a.size();k++) res.push_back(a[k]); for (ll k = i;k < i + j && k < b.size();k++) res.push_back(b[k]); } } int main(){ ios_base::sync_with_stdio(NULL); cin.tie(0); cout.tie(0); #define task "test" if (fopen(task".inp","r")){ freopen(task".inp","r",stdin); //freopen(task".out","w",stdout); } cin>>n; for (ll i = 1;i <= n;i++) cin>>a[i]; need[1][0][1] = 1; for (ll node = 1;node <= n/2;node++){ for (ll i = 0;node >> i;i++){ for (auto j : {0,1}){ if (!need[node][i][j]) continue; ll p = ((node >> i + 1) << 1) + j; ll mn = min({a[p],a[node*2],a[node*2 + 1]}); if (mn == a[node*2]) need[2*node][i + 1][j] = need[2*node + 1][0][1] = 1; else if (mn == a[p]) need[2*node][0][0] = need[2*node + 1][0][1] = 1; else need[2*node][0][0] = need[2*node + 1][0][0] = 1, need[2*node][i + 1][j] = need[2*node + 1][i + 1][j] = 1; } } } for (ll node = n;node;node--){ for (ll i = 0;node >> i;i++){ for (auto j : {0,1}){ if (!need[node][i][j]) continue; ll p = ((node >> i + 1) << 1) + j; if (2*node > n) dp[node][i][j] = {a[p]}; else if (2*node == n) dp[node][i][j] = {min(a[p],a[node*2]),max(a[p],a[node*2])}; else{ ll mn = min({a[p],a[2*node],a[2*node + 1]}); if (mn == a[2*node + 1]){ tmp1 = tmp2 = {a[2*node + 1]}; Merge(tmp1,dp[2*node][0][0],dp[2*node + 1][i + 1][j]); Merge(tmp2,dp[2*node][i + 1][j],dp[2*node + 1][0][0]); dp[node][i][j] = min(tmp1,tmp2); } else{ dp[node][i][j] = {min(a[p],a[2*node])}; if (mn == a[p]) Merge(dp[node][i][j],dp[2*node][0][0],dp[2*node + 1][0][1]); else Merge(dp[node][i][j],dp[2*node][i + 1][j],dp[2*node + 1][0][1]); } } } } if (2*node < n){ for (ll i = 0;2*node >> i;i++){ for (auto j : {0,1}) vector<ll>().swap(dp[2*node][i][j]), vector<ll>().swap(dp[2*node + 1][i][j]); } } } for (auto i : dp[1][0][1]) cout<<i<<" "; } /* stuff you should look for * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */

Compilation message (stderr)

swap.cpp: In function 'void Merge(std::vector<int>&, std::vector<int>&, std::vector<int>&)':
swap.cpp:17:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for (ll i = 0,j = 1;i < a.size();i += j,j *= 2){
      |                         ~~^~~~~~~~~~
swap.cpp:18:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |         for (ll k = i;k < i + j && k < a.size();k++) res.push_back(a[k]);
      |                                    ~~^~~~~~~~~~
swap.cpp:19:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |         for (ll k = i;k < i + j && k < b.size();k++) res.push_back(b[k]);
      |                                    ~~^~~~~~~~~~
swap.cpp: In function 'int main()':
swap.cpp:38:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |                 ll p = ((node >> i + 1) << 1) + j;
      |                                  ~~^~~
swap.cpp:56:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   56 |                 ll p = ((node >> i + 1) << 1) + j;
      |                                  ~~^~~
swap.cpp:27:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...