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

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

#define MAX_N 1001

struct S {
  int y, x;
  S(int y, int x) : y(y), x(x) {}
};

const int dy[] = {0, 1, 0, -1}, dx[] = {1, 0, -1, 0};

int W, H, N;
int X1[MAX_N], Y1[MAX_N], X2[MAX_N], Y2[MAX_N];

int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  for (int i = 0; i < N; i++) {
    if (x1[i] - 1 >= 0)
      xs.push_back(x1[i] - 1);
    xs.push_back(x1[i]);
    xs.push_back(x2[i] - 1);
    if (x2[i] < w)
      xs.push_back(x2[i]);
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (int i = 0; i < N; i++) {
    x1[i] = lower_bound(xs.begin(), xs.end(), x1[i]) - xs.begin();
    x2[i] = lower_bound(xs.begin(), xs.end(), x2[i]) - xs.begin();
  }
  return xs.size();
}

int main() {
  while (scanf("%d %d", &W, &H), W || H) {
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
      scanf("%d %d %d %d", &X1[i], &Y1[i], &X2[i], &Y2[i]);
    }
    int w = compress(X1, X2, W);
    int h = compress(Y1, Y2, H);

    bool F[h][w];
    memset(F, 0, sizeof(F));
    for (int n = 0; n < N; n++) {
      for (int i = Y1[n]; i < Y2[n]; i++) {
        for (int j = X1[n]; j < X2[n]; j++) {
          F[i][j] = true;
        }
      }
    }

    bool used[h][w];
    memset(used, 0, sizeof(used));
    int cnt = 0;
    for (int y = 0; y < h; y++) {
      for (int x = 0; x < w; x++) {
        if (!used[y][x] && !F[y][x]) {
          cnt++;
          used[y][x] = true;
          queue<S> q;
          q.push(S(y, x));
          while (!q.empty()) {
            S s = q.front();
            q.pop();
            for (int i = 0; i < 4; i++) {
              int ny = s.y + dy[i], nx = s.x + dx[i];
              if (!(0 <= ny && ny < h && 0 <= nx && nx < w))
                continue;
              if (!used[ny][nx] && !F[ny][nx]) {
                used[ny][nx] = true;
                q.push(S(ny, nx));
              }
            }
          }
        }
      }
    }

    printf("%d\\n", cnt);
  }
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;
const int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
int w, h, n;
int X1[1000 + 1], Y1[1000 + 1], X2[1000 + 1], Y2[1000 + 1];
int field[1000 + 100][1000 + 100];

int compree(int *X1, int w) {
  vector<int> xs;
  for (int i = 0; i < n; i++)
    for (int d = -1; d <= 1; d++) {
      int tx = X1[i] + d;
      if (1 <= tx && tx <= w)
        xs.push_back(tx);
    }
  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();
  return xs.size();
}

int main() {
  while (~scanf("%d %d", &w, &h) && (w || h)) {
    memset(field, 0, sizeof(field));
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
      scanf("%d %d %d %d", X1 + i, Y1 + i, X2 + i, Y2 + i);
    compree(X1, w);
    compree(Y1, w);
    w = compree(X2, w);
    h = compree(Y2, h);
    for (int i = 0; i < n; i++) {
      for (int x = X1[i]; x <= X2[i]; x++)
        for (int y = Y1[i]; y <= Y2[i]; y++)
          field[x][y] = 1;
    }

    int ans = 0;
    for (int i = 0; i < w; i++)
      for (int j = 0; j < h; j++) {
        if (field[i][j])
          continue;
        ans++;
        queue<pair<int, int>> que;
        que.push(make_pair(i, j));
        while (!que.empty()) {
          int x = que.front().first, y = que.front().second;
          field[x][y] = 1;
          que.pop();
          for (int d = 0; d < 4; d++) {
            int tx = x + dir[d][0], ty = y + dir[d][1];
            if (0 <= tx && tx < w && 0 <= ty && ty < h && !field[tx][ty])
              que.push(make_pair(tx, ty));
          }
        }
      }
    printf("%d\\n", ans);
  }
  return 0;
}