Problem p02618 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <bits/stdc++.h>
#include <ctime>
#define rep(i, a, ...)                                                         \\
  for (int i = (a) * (strlen(#__VA_ARGS__) != 0);                              \\
       i < (int)(strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)); ++i)
#define per(i, a, ...)                                                         \\
  for (int i = (strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)) - 1;                 \\
       i >= (int)(strlen(#__VA_ARGS__) ? (a) : 0); --i)
#define foreach(i, n) for (auto &i : (n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
#define lambda(RES_TYPE, ...)                                                  \\
  (function<RES_TYPE(__VA_ARGS__)>)[&](__VA_ARGS__)->RES_TYPE
#define method(FUNC_NAME, RES_TYPE, ...)                                       \\
  function<RES_TYPE(__VA_ARGS__)> FUNC_NAME = lambda(RES_TYPE, __VA_ARGS__)
using ll = long long;
// const ll MOD = (ll)1e9+7;
const ll MOD = 998244353;
const int INF = (ll)1e9 + 7;
const ll INFLL = (ll)1e18;
using namespace std;
template <class t> using vvector = vector<vector<t>>;
template <class t> using vvvector = vector<vector<vector<t>>>;
template <class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template <class t, class u> bool chmax(t &a, u b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class t, class u> bool chmin(t &a, u b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#ifdef DEBUG
#define debug(x)                                                               \\
  cout << "LINE " << __LINE__ << ": " << #x << " = " << x << endl;
#else
#define debug(x) (void)0
#endif

namespace templates {
ll modpow(ll x, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    b >>= 1;
  }
  return res;
}

ll modinv(ll x) { return modpow(x, MOD - 2); }

bool was_output = false;
template <class t> void output(t a) {
  if (was_output)
    cout << " ";
  cout << a;
  was_output = true;
}
void outendl() {
  was_output = false;
  cout << endl;
}
ll in() {
  ll res;
  scanf("%lld", &res);
  return res;
}

template <class t> istream &operator>>(istream &is, vector<t> &x) {
  for (auto &i : x)
    is >> i;
  return is;
}

template <class t, class u> istream &operator>>(istream &is, pair<t, u> &x) {
  is >> x.first >> x.second;
  return is;
}

template <class t> void in(t &x) { cin >> x; }

template <class t> t in() {
  t res;
  cin >> res;
  return res;
}

template <class t> void out(t x) { cout << x; }

template <class t>
vector<t> sorted(
    vector<t> line,
    function<bool(t, t)> comp = [](t a, t b) { return a < b; }) {
  sort(line.begin(), line.end(), comp);
  return line;
}

template <class t> vector<t> reversed(vector<t> line) {
  reverse(line.begin(), line.end());
  return line;
}
} // namespace templates

using namespace templates;

class points {
public:
  int n;
  vector<ll> last;
  int use;
  int point;
  points *parent;
  points() {
    n = 0;
    last.resize(26, 0);
    use = 0;
    point = 0;
    parent = nullptr;
  }

  points(points *par, int place, int max_day, vector<ll> &cs, vvector<ll> &ss,
         int mul) {
    last = par->last;
    n = par->n;
    point = par->point;
    point += ss[n][place] * mul +
             (max_day - n + 1) * (n + 1 - last[place]) * cs[place];
    ++n;
    last[place] = n;
    use = place;
    parent = par;
  }

  vector<ll> get_line() {
    vector<ll> res;
    points *p = this;
    while (p->parent != nullptr) {
      res.emplace_back(p->use);
      p = p->parent;
    }
    reverse(all(res));
    return res;
  }
};

bool operator<(const points a, const points b) { return a.point < b.point; }
bool operator>(const points a, const points b) { return a.point > b.point; }

bool compare(points *a, points *b) { return a->point > b->point; }

int main() {

  int n = in();
  vector<ll> cs(26);
  foreach (i, cs)
    i = in();
  vvector<ll> ss(n, vector<ll>(26));
  foreach (i, ss) {
    foreach (j, i) {
      j = in();
    }
  }
  vector<ll> ans(n, 0);

  method(eval_score, ll) {
    vector<ll> last(26, 0);
    ll res = 0;
    rep(i, n) {
      res += ss[i][ans[i]];
      last[ans[i]] = i + 1;
      rep(j, 26) { res -= cs[j] * (i - last[j] + 1); }
    }
    return res;
  };

  method(eval_line, ll, vector<ll> ans) {
    vector<ll> last(26, 0);
    ll res = 0;
    rep(i, n) {
      res += ss[i][ans[i]];
      last[ans[i]] = i + 1;
      rep(j, 26) { res -= cs[j] * (i - last[j] + 1); }
    }
    return res;
  };

  int mul = 20;

  method(func, vector<ll>) {
    vector<points *> line;
    line.emplace_back(new points());
    rep(i, n) {
      vector<points *> next;
      foreach (j, line) {
        rep(k, 26) { next.emplace_back(new points(j, k, n, cs, ss, mul)); }
      }
      sort(all(next), compare);
      while (next.size() > 2e2) {
        delete next.back();
        next.pop_back();
      }
      line = next;
    }
    ll max_score = eval_line(line[0]->get_line());
    vector<ll> res = line[0]->get_line();
    foreach (i, line) {
      if (chmax(max_score, eval_line(line[0]->get_line()))) {
        res = i->get_line();
      }
    }
    foreach (i, line) {
      delete i;
    }
    return res;
  };

  ans = func();
  int max_score = eval_line(ans);
  foreach (i, ans) {
    cout << i + 1 << endl;
  }

  return 0;
}


Error: MLE

Fixed submission:

#include <bits/stdc++.h>
#include <ctime>
#define rep(i, a, ...)                                                         \\
  for (int i = (a) * (strlen(#__VA_ARGS__) != 0);                              \\
       i < (int)(strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)); ++i)
#define per(i, a, ...)                                                         \\
  for (int i = (strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)) - 1;                 \\
       i >= (int)(strlen(#__VA_ARGS__) ? (a) : 0); --i)
#define foreach(i, n) for (auto &i : (n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
#define lambda(RES_TYPE, ...)                                                  \\
  (function<RES_TYPE(__VA_ARGS__)>)[&](__VA_ARGS__)->RES_TYPE
#define method(FUNC_NAME, RES_TYPE, ...)                                       \\
  function<RES_TYPE(__VA_ARGS__)> FUNC_NAME = lambda(RES_TYPE, __VA_ARGS__)
using ll = long long;
// const ll MOD = (ll)1e9+7;
const ll MOD = 998244353;
const int INF = (ll)1e9 + 7;
const ll INFLL = (ll)1e18;
using namespace std;
template <class t> using vvector = vector<vector<t>>;
template <class t> using vvvector = vector<vector<vector<t>>>;
template <class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template <class t, class u> bool chmax(t &a, u b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class t, class u> bool chmin(t &a, u b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#ifdef DEBUG
#define debug(x)                                                               \\
  cout << "LINE " << __LINE__ << ": " << #x << " = " << x << endl;
#else
#define debug(x) (void)0
#endif

namespace templates {
ll modpow(ll x, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    b >>= 1;
  }
  return res;
}

ll modinv(ll x) { return modpow(x, MOD - 2); }

bool was_output = false;
template <class t> void output(t a) {
  if (was_output)
    cout << " ";
  cout << a;
  was_output = true;
}
void outendl() {
  was_output = false;
  cout << endl;
}
ll in() {
  ll res;
  scanf("%lld", &res);
  return res;
}

template <class t> istream &operator>>(istream &is, vector<t> &x) {
  for (auto &i : x)
    is >> i;
  return is;
}

template <class t, class u> istream &operator>>(istream &is, pair<t, u> &x) {
  is >> x.first >> x.second;
  return is;
}

template <class t> void in(t &x) { cin >> x; }

template <class t> t in() {
  t res;
  cin >> res;
  return res;
}

template <class t> void out(t x) { cout << x; }

template <class t>
vector<t> sorted(
    vector<t> line,
    function<bool(t, t)> comp = [](t a, t b) { return a < b; }) {
  sort(line.begin(), line.end(), comp);
  return line;
}

template <class t> vector<t> reversed(vector<t> line) {
  reverse(line.begin(), line.end());
  return line;
}
} // namespace templates

using namespace templates;

class points {
public:
  int n;
  vector<ll> last;
  int use;
  int point;
  points *parent;
  points() {
    n = 0;
    last.resize(26, 0);
    use = 0;
    point = 0;
    parent = nullptr;
  }

  points(points *par, int place, int max_day, vector<ll> &cs, vvector<ll> &ss,
         int mul) {
    last = par->last;
    n = par->n;
    point = par->point;
    point += ss[n][place] * mul +
             (max_day - n + 1) * (n + 1 - last[place]) * cs[place];
    ++n;
    last[place] = n;
    use = place;
    parent = par;
  }

  vector<ll> get_line() {
    vector<ll> res;
    points *p = this;
    while (p->parent != nullptr) {
      res.emplace_back(p->use);
      p = p->parent;
    }
    reverse(all(res));
    return res;
  }
};

bool operator<(const points a, const points b) { return a.point < b.point; }
bool operator>(const points a, const points b) { return a.point > b.point; }

bool compare(points *a, points *b) { return a->point > b->point; }

int main() {

  int n = in();
  vector<ll> cs(26);
  foreach (i, cs)
    i = in();
  vvector<ll> ss(n, vector<ll>(26));
  foreach (i, ss) {
    foreach (j, i) {
      j = in();
    }
  }
  vector<ll> ans(n, 0);

  method(eval_score, ll) {
    vector<ll> last(26, 0);
    ll res = 0;
    rep(i, n) {
      res += ss[i][ans[i]];
      last[ans[i]] = i + 1;
      rep(j, 26) { res -= cs[j] * (i - last[j] + 1); }
    }
    return res;
  };

  method(eval_line, ll, vector<ll> ans) {
    vector<ll> last(26, 0);
    ll res = 0;
    rep(i, n) {
      res += ss[i][ans[i]];
      last[ans[i]] = i + 1;
      rep(j, 26) { res -= cs[j] * (i - last[j] + 1); }
    }
    return res;
  };

  method(func, vector<ll>) {
    int mul = rand() % 1000;
    vector<points *> line;
    line.emplace_back(new points());
    rep(i, n) {
      vector<points *> next;
      foreach (j, line) {
        rep(k, 26) { next.emplace_back(new points(j, k, n, cs, ss, mul)); }
      }
      sort(all(next), compare);
      while (next.size() > 1e2)
        next.pop_back();
      line = next;
    }
    ll max_score = eval_line(line[0]->get_line());
    vector<ll> res = line[0]->get_line();
    foreach (i, line) {
      if (chmax(max_score, eval_line(line[0]->get_line()))) {
        res = i->get_line();
      }
    }
    return res;
  };

  int max_score = -INF;
  while (clock() / (double)(CLOCKS_PER_SEC) < 1.6) {
    vector<ll> current = func();
    if (chmax(max_score, eval_line(current))) {
      ans = current;
    }
  }

  foreach (i, ans) {
    cout << i + 1 << endl;
  }

  return 0;
}