Problem p02557 (C++) — buggy submission, verdict: Time Limit Exceeded

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// #include <bits/stdc++.h>
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>
using namespace std;
#define IOS                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define trace(x) cerr << #x << ": " << x << " " << endl;

typedef int64_t ll;

#define endl '\\n'
#define int ll
ll mod = 1e9 + 7;
ll mod1 = 1e9 + 5;
ll power(ll a, ll b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return power(((((a) % mod) * ((a) % mod)) % mod), b / 2) % mod;
  else
    return (((a) % mod) *
            (power(((((a) % mod) * ((a) % mod)) % mod), b / 2) % mod)) %
           mod;
}
inline ll inverse(ll a, ll md) {
  a %= md;
  if (a < 0)
    a += md;
  ll b = md, u = 0, v = 1;
  while (a) {
    ll t = b / a;
    b -= t * a;
    swap(a, b);
    u -= t * v;
    swap(u, v);
  }
  assert(b == 1);
  if (u < 0)
    u += md;
  return u;
}

// using namespace __gnu_pbds;
// #define ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>
// find_by_order(k)  returns iterator to kth element starting from 0;
// order_of_key(k) returns count of elements strictly smaller than k;
// erase,insert same as normal set
// mt19937
// mrand(chrono::high_resolution_clock::now().time_since_epoch().count()); //for
// randomized solution
const int ce = 1e9 + 7;
ll fast_mod(ll input) { return input < ce ? input : input % ce; }

int32_t main() {
  IOS
#ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
#endif

  int n;
  cin >> n;
  int a[n + 1];
  for (int i = 1; i <= n; i++)
    cin >> a[i];
  int b[n + 1], b1[n + 1];
  for (int i = 1; i <= n; i++)
    cin >> b[i], b1[i] = b[i];
  multiset<int> m;
  for (int i = 1; i <= n; i++)
    m.insert(b[i]);
  int ch = 0;
  for (int i = 1; i <= n; i++) {
    auto it = m.upper_bound(a[i]);
    if (it == m.end()) {
      it = m.lower_bound(a[i]);
      if (it == m.begin()) {
        ch = 1;
        b[i] = *it;
        m.erase(it);
        continue;
      }
      it--;
      b[i] = *it;
      m.erase(it);
    } else {
      b[i] = *it;
      m.erase(it);
    }
  }
  if (!ch) {
    cout << "Yes" << endl;
    for (int i = 1; i <= n; i++)
      cout << b[i] << " ";
  } else {
    m.clear();
    for (int i = 1; i <= n; i++) {
      if (a[i] == b[i]) {
        for (int j = 1; j <= i; j++) {
          if (b[j] != a[i] and b[i] != a[j]) {
            swap(b[j], b[i]);
            break;
          }
        }
        if (a[i] == b[i]) {
          cout << "No" << endl;
          return 0;
        }
      }
    }
    cout << "Yes" << endl;
    for (int i = 1; i <= n; i++)
      cout << b[i] << " ";
  }
}


Error: TLE

Fixed submission:

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
#include <algorithm>
#include <bits/stdc++.h>
#include <cassert>
#include <cmath>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>
using namespace std;
#define IOS                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define trace(x) cerr << #x << ": " << x << " " << endl;

typedef int64_t ll;

#define endl '\\n'
#define int ll
ll mod = 1e9 + 7;
ll mod1 = 1e9 + 5;
ll power(ll a, ll b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return power(((((a) % mod) * ((a) % mod)) % mod), b / 2) % mod;
  else
    return (((a) % mod) *
            (power(((((a) % mod) * ((a) % mod)) % mod), b / 2) % mod)) %
           mod;
}
inline ll inverse(ll a, ll md) {
  a %= md;
  if (a < 0)
    a += md;
  ll b = md, u = 0, v = 1;
  while (a) {
    ll t = b / a;
    b -= t * a;
    swap(a, b);
    u -= t * v;
    swap(u, v);
  }
  assert(b == 1);
  if (u < 0)
    u += md;
  return u;
}

// using namespace __gnu_pbds;
// #define ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>
// find_by_order(k)  returns iterator to kth element starting from 0;
// order_of_key(k) returns count of elements strictly smaller than k;
// erase,insert same as normal set
mt19937 mrand(chrono::high_resolution_clock::now()
                  .time_since_epoch()
                  .count()); // for randomized solution
const int ce = 1e9 + 7;
ll fast_mod(ll input) { return input < ce ? input : input % ce; }

int32_t main() {
  IOS
#ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
#endif

  int n;
  cin >> n;
  int a[n + 1];
  map<int, int> m;
  for (int i = 1; i <= n; i++)
    cin >> a[i], m[a[i]]++;
  int b[n + 1];
  for (int i = 1; i <= n; i++)
    cin >> b[i];
  int c = 0;
  while (c++ < 500) {
    shuffle(b + 1, b + n + 1, mrand);
    int ch = 0;
    for (int i = 1; i <= n; i++) {
      if (a[i] == b[i]) {
        ch = 1;
        break;
      }
    }
    if (ch)
      continue;
    cout << "Yes" << endl;
    for (int i = 1; i <= n; i++)
      cout << b[i] << " ";
    return 0;
  }
  cout << "No";
}