Submission #375332

# Submission time Handle Problem Language Result Execution time Memory
375332 2021-03-09T09:22:39 Z Mamnoon_Siam Swap (BOI16_swap) C++17
0 / 100
159 ms 262144 KB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ii = pair<int, int>;
using vi = deque<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;

unordered_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[]) {
#ifdef LOCAL
  freopen("in", "r", stdin);
#endif
  scanf("%d", &n);
  nn = 1;
  while(nn-1 < n) nn *= 2;
  nn--;
  for(int i = 1; i <= n; ++i)
    scanf("%d", &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]);
  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]);
    }
  }
  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);
      }
    }
    for(int v:{2*u,2*u+1}) {
      // for(auto pa : dp[v]) pa.second.clear();
      dp[v].clear();
    }
  }
  vi ans = dp[1][a[1]];
  for(int i = 0; i < n; ++i)
    cout << ans[i] << ' ';
  cout << endl;
}

Compilation message

swap.cpp: In function 'int main(int, char**)':
swap.cpp:37:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   37 |   scanf("%d", &n);
      |   ~~~~~^~~~~~~~~~
swap.cpp:42:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   42 |     scanf("%d", &a[i]);
      |     ~~~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -