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

#include <bits/stdc++.h>
#define PB push_back
#define MP make pair
#define FI first
#define SE second
using namespace std;
static const int INF = 1ll << 60;
typedef pair<int, int> pii;

int W, H, N;
int X1[1001], Y1[1001], X2[1001], Y2[1001];
int fld[3000][3000];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int ans;
vector<int> xs;

int compress(int *x1, int *x2, int w) {
  xs.clear();
  for (int i = 0; i < N; ++i) {
    for (int d = -1; d <= 1; ++d) {
      int tx1 = x1[i] + d;
      int tx2 = x2[i] + d;
      if (0 <= tx1 && tx1 < w)
        xs.PB(tx1);
      if (0 <= tx2 && tx2 < w)
        xs.PB(tx2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (int i = 0; i < N; ++i) {
    x1[i] = find(xs.begin(), xs.end(), x1[i]) - xs.begin();
    x2[i] = find(xs.begin(), xs.end(), x2[i]) - xs.begin();
  }
  return xs.size();
}

void bfs(int sx, int sy) {
  queue<pii> que;
  que.push(pii(sx, sy));
  while (!que.empty()) {
    pii p = que.front();
    que.pop();
    int x = p.FI;
    int y = p.SE;
    for (int i = 0; i < 4; ++i) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (nx < 0 || nx >= W || ny < 0 || ny >= H)
        continue;
      if (fld[ny][nx] == 1)
        continue;
      fld[ny][nx] = 1;
      que.push(pii(nx, ny));
    }
  }
}

signed main() {
  while (1) {
    cin >> W >> H;
    if (W == 0 && H == 0)
      break;
    cin >> N;
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
    }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);
    for (int i = 0; i < N; ++i) {
      for (int y = Y1[i]; y < Y2[i]; ++y) {
        for (int x = X1[i]; x < X2[i]; ++x) {
          fld[y][x] = 1;
        }
      }
    }
    for (int y = 0; y < H; ++y) {
      for (int x = 0; x < W; ++x) {
        if (fld[y][x] == 1)
          continue;
        bfs(x, y);
        ans++;
      }
    }
    cout << ans << endl;
    memset(fld, 0, sizeof(fld));
    ans = 0;
  }
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
#define PB push_back
#define MP make pair
#define FI first
#define SE second
using namespace std;
static const int INF = 1ll << 60;
typedef pair<int, int> pii;

int W, H, N;
int X1[1001], Y1[1001], X2[1001], Y2[1001];
int fld[5000][5000];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int ans;
vector<int> xs;

int compress(int *x1, int *x2, int w) {
  xs.clear();
  for (int i = 0; i < N; ++i) {
    for (int d = -1; d <= 1; ++d) {
      int tx1 = x1[i] + d;
      int tx2 = x2[i] + d;
      if (0 <= tx1 && tx1 < w)
        xs.PB(tx1);
      if (0 <= tx2 && tx2 < w)
        xs.PB(tx2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (int i = 0; i < N; ++i) {
    x1[i] = find(xs.begin(), xs.end(), x1[i]) - xs.begin();
    x2[i] = find(xs.begin(), xs.end(), x2[i]) - xs.begin();
  }
  return xs.size();
}

void bfs(int sx, int sy) {
  queue<pii> que;
  que.push(pii(sx, sy));
  while (!que.empty()) {
    pii p = que.front();
    que.pop();
    int x = p.FI;
    int y = p.SE;
    fld[y][x] = 1;
    for (int i = 0; i < 4; ++i) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (nx < 0 || nx >= W || ny < 0 || ny >= H)
        continue;
      if (fld[ny][nx] == 1)
        continue;
      fld[ny][nx] = 1;
      que.push(pii(nx, ny));
    }
  }
}

signed main() {
  while (1) {
    cin >> W >> H;
    if (W == 0 && H == 0)
      break;
    cin >> N;
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
    }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);
    for (int i = 0; i < N; ++i) {
      for (int y = Y1[i]; y < Y2[i]; ++y) {
        for (int x = X1[i]; x < X2[i]; ++x) {
          fld[y][x] = 1;
        }
      }
    }
    for (int y = 0; y < H; ++y) {
      for (int x = 0; x < W; ++x) {
        if (fld[y][x] == 1)
          continue;
        bfs(x, y);
        ans++;
      }
    }
    cout << ans << endl;
    memset(fld, 0, sizeof(fld));
    ans = 0;
  }
}