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

#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 + 1000][1000 + 1000];

int compree(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] = find(xs.begin(), xs.end(), X1[i]) - xs.begin();
    X2[i] = find(xs.begin(), xs.end(), X2[i]) - xs.begin();
  }
  return xs.size();
}

int main() {
  // freopen("../input.in", "r", stdin);
  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);
    w = compree(X1, X2, w);
    h = compree(Y1, 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++;
        field[i][j] = 1;
        queue<pair<int, int>> que;
        que.push(make_pair(i, j));
        while (!que.empty()) {
          int x = que.front().first, y = que.front().second;
          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));
              field[tx][ty] = 1;
            }
          }
        }
      }
    printf("%d\\n", ans);
  }
  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 + 10], Y1[1000 + 10], X2[1000 + 10], Y2[1000 + 10];
int field[1000][1000];

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;
}