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

#include <algorithm>
#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define ll long long
#define vvi vector<vector<int>>
#define vi vector<int>
#define All(X) X.begin(), X.end()
#define FOR(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
#define pii pair<int, int>
#define mp make_pair
#define pi 3.14159265359
#define shosu(X) fixed << setprecision(X)
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

struct Dice {
  int t, r, f;
  int top() { return t; }
  int bottom() { return 7 - t; }
  int right() { return r; }
  int left() { return 7 - r; }
  int front() { return f; }
  int back() { return 7 - f; }
  void toFront() {
    swap(f, t);
    t = 7 - t;
  }
  void toBack() {
    toFront();
    toFront();
    toFront();
  }
  void toRight() {
    swap(t, r);
    t = 7 - t;
  }
  void toLeft() {
    toRight();
    toRight();
    toRight();
  }
  void toClock() {
    swap(f, r);
    r = 7 - r;
  }
  void toConter() {
    toClock();
    toClock();
    toClock();
  }
  int roll(int tt, int ff) {
    REP(i, 30) {
      if (i % 10 == 0)
        toRight();
      else if (i % 10 == 5)
        toFront();
      else
        toClock();
      if (tt == t && ff == f)
        return r;
    }
    return 0;
  }
};

bool movalble(int face) { return (face == 4 || face == 5 || face == 6); };
int high[256][256];
int topmap[256][256];
int ans[6];

void mydebug() {
  REP(j, 256) {
    REP(k, 256) {
      if (topmap[j][k] != 0)
        cout << "(" << j << "," << k << ")" << topmap[j][k]
             << "(high:" << high[j][k] << ") ";
    }
  }
  cout << endl;
}

int main() {
  int n;
  while (cin >> n, n) {
    REP(i, 256) REP(j, 256) {
      high[i][j] = 0;
      topmap[i][j] = 0;
    }
    REP(i, 6) ans[i] = 0;
    REP(i, n) {
      Dice d;
      d.t = 1;
      d.f = 3;
      d.r = 5;
      int t, f;
      cin >> t >> f;
      d.roll(t, f);
      int x = 128, y = 128;
      int nowhigh = high[x][y];
      bool isstop = false;
      for (; isstop == false;) {
        int dir = 0;
        isstop = true;
        if (movalble(d.front()) && high[x - 1][y] < nowhigh)
          dir = max(dir, d.front());
        if (movalble(d.back()) && high[x + 1][y] < nowhigh)
          dir = max(dir, d.back());
        if (movalble(d.right()) && high[x][y + 1] < nowhigh)
          dir = max(dir, d.right());
        if (movalble(d.left()) && high[x][y - 1] < nowhigh)
          dir = max(dir, d.left());
        if (dir != 0 && dir == d.front()) {
          d.toFront();
          isstop = false;
          nowhigh = high[x - 1][y];
          x--;
          continue;
        }
        if (dir != 0 && dir == d.back()) {
          d.toBack();
          isstop = false;
          nowhigh = high[x + 1][y];
          x++;
          continue;
        }
        if (dir != 0 && dir == d.right()) {
          d.toRight();
          isstop = false;
          nowhigh = high[x][y + 1];
          y++;
          continue;
        }
        if (dir != 0 && dir == d.left()) {
          d.toLeft();
          isstop = false;
          nowhigh = high[x][y - 1];
          y--;
          continue;
        }
      }
      high[x][y]++;
      if (topmap[x][y] != 0) {
        if (ans[topmap[x][y] - 1] != 0) {
          ans[topmap[x][y] - 1]--;
        }
      }
      topmap[x][y] = d.top();
      ans[d.top() - 1]++;
      // mydebug();
    }
    REP(i, 6) {
      cout << ans[i];
      if (i != 5)
        cout << " ";
      else
        cout << endl;
    }
  }
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define ll long long
#define vvi vector<vector<int>>
#define vi vector<int>
#define All(X) X.begin(), X.end()
#define FOR(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
#define pii pair<int, int>
#define mp make_pair
#define pi 3.14159265359
#define shosu(X) fixed << setprecision(X)
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

struct Dice {
  int t, r, f;
  int top() { return t; }
  int bottom() { return 7 - t; }
  int right() { return r; }
  int left() { return 7 - r; }
  int front() { return f; }
  int back() { return 7 - f; }
  void toFront() {
    swap(f, t);
    t = 7 - t;
  }
  void toBack() {
    toFront();
    toFront();
    toFront();
  }
  void toRight() {
    swap(t, r);
    t = 7 - t;
  }
  void toLeft() {
    toRight();
    toRight();
    toRight();
  }
  void toClock() {
    swap(f, r);
    r = 7 - r;
  }
  void toConter() {
    toClock();
    toClock();
    toClock();
  }
  int roll(int tt, int ff) {
    REP(i, 30) {
      if (i % 10 == 0)
        toRight();
      else if (i % 10 == 5)
        toFront();
      else
        toClock();
      if (tt == t && ff == f)
        return r;
    }
    return 0;
  }
};

bool movalble(int face) { return (face == 4 || face == 5 || face == 6); };
int high[3000][3000];
int topmap[3000][3000];
int ans[6];
int main() {
  int n;
  while (cin >> n, n) {
    REP(i, 3000) REP(j, 3000) {
      high[i][j] = 0;
      topmap[i][j] = 0;
    }
    REP(i, 6) ans[i] = 0;
    REP(i, n) {
      Dice d;
      d.t = 1;
      d.f = 3;
      d.r = 5;
      int t, f;
      cin >> t >> f;
      d.roll(t, f);
      int x = 1500, y = 1500;
      int nowhigh = high[x][y];
      bool isstop = false;
      for (; isstop == false;) {
        int dir = 0;
        isstop = true;
        if (movalble(d.front()) && high[x - 1][y] < nowhigh)
          dir = max(dir, d.front());
        if (movalble(d.back()) && high[x + 1][y] < nowhigh)
          dir = max(dir, d.back());
        if (movalble(d.right()) && high[x][y + 1] < nowhigh)
          dir = max(dir, d.right());
        if (movalble(d.left()) && high[x][y - 1] < nowhigh)
          dir = max(dir, d.left());
        if (dir != 0 && dir == d.front()) {
          x--;
          d.toFront();
          isstop = false;
          nowhigh--;
          continue;
        }
        if (dir != 0 && dir == d.back()) {
          x++;
          d.toBack();
          isstop = false;
          nowhigh--;
          continue;
        }
        if (dir != 0 && dir == d.right()) {
          y++;
          d.toRight();
          isstop = false;
          nowhigh--;
          continue;
        }
        if (dir != 0 && dir == d.left()) {
          y--;
          d.toLeft();
          isstop = false;
          nowhigh--;
          continue;
        }
      }
      high[x][y]++;
      if (topmap[x][y] != 0) {
        if (ans[topmap[x][y] - 1] != 0) {
          ans[topmap[x][y] - 1]--;
        }
      }
      topmap[x][y] = d.top();
      ans[d.top() - 1]++;
    }
    REP(i, 6) {
      cout << ans[i];
      if (i != 5)
        cout << " ";
      else
        cout << endl;
    }
  }
}