Problem p00454 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define MAX_N 1000 + 16

using namespace std;

int N, H, W;
int X1[MAX_N], X2[MAX_N], Y1[MAX_N], Y2[MAX_N];
int fld[6 * MAX_N][6 * MAX_N], dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};

int compress(int *x1, int *x2, int w) {
  vector<double> xs;

  for (int i = 0; i < N; ++i) {
    for (double id = -0.5; id <= 0.5; id += 0.5) {
      double tx1 = x1[i] + id, tx2 = x2[i] + id;
      if (0 <= tx1 && tx1 <= w)
        xs.push_back(tx1);
      if (0 <= tx2 && tx2 <= w)
        xs.push_back(tx2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  // for (double x : xs) cout << x << "-";cout << endl;
  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();
  } // cout<<xs.size()<<"**********"<<endl;
  return xs.size();
}
int main() {
  while (cin >> W >> H, W | H) {
    cin >> N;
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
    }

    memset(fld, 0, sizeof(fld));

    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    for (int i = 0; i < N; ++i) {
      // cout << X1[i] << ends << X2[i] << ends << Y1[i] << ends << Y2[i] <<
      // endl;
      for (int j = X1[i]; j <= X2[i]; ++j) {
        for (int k = Y1[i]; k <= Y2[i]; ++k)
          fld[j][k] = 1;
      }
    }
    // for (int i = 0; i < W; ++i) {for (int j = 0; j < H; ++j)cout << fld[i][j]
    // << ends;cout << endl;}
    int ans = 0;
    // cout << 123 << endl;
    for (int i = 0; i < W; ++i) {
      for (int j = 0; j < H; ++j) {
        if (!fld[i][j]) {
          fld[i][j] = 1;
          ++ans;
          queue<int> q;
          q.push(i * H + j);
          while (!q.empty()) {
            int ii = q.front() / H, jj = q.front() % H;
            q.pop();
            for (int k = 0; k < 4; ++k) {
              int ni = ii + dx[k], nj = jj + dy[k];
              if (ni >= 0 && ni < W && nj >= 0 && nj < H && !fld[ni][nj]) {
                fld[ni][nj] = 1;
                q.push(ni * H + nj);
              }
            }
          }
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define MAX_N 1000 + 16

using namespace std;

int N, H, W;
int X1[MAX_N], X2[MAX_N], Y1[MAX_N], Y2[MAX_N];
int fld[2 * MAX_N][2 * MAX_N], dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};

int compress(int *x1, int *x2, int w) {
  vector<double> xs;

  for (int i = 0; i < N; ++i) {
    for (double id = -0.5; id <= 0.5; id += 0.5) {
      double tx1 = x1[i] + id, tx2 = x2[i] + id;
      if (0 <= tx1 && tx1 <= w)
        xs.push_back(tx1);
      if (0 <= tx2 && tx2 <= w)
        xs.push_back(tx2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  // for (double x : xs) cout << x << "-";cout << endl;
  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();
  } // cout<<xs.size()<<"**********"<<endl;
  return xs.size();
}
int main() {
  while (cin >> W >> H, W | H) {
    cin >> N;
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
    }

    memset(fld, 0, sizeof(fld));

    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    for (int i = 0; i < N; ++i) {
      // cout << X1[i] << ends << X2[i] << ends << Y1[i] << ends << Y2[i] <<
      // endl;
      for (int j = X1[i]; j <= X2[i]; ++j) {
        for (int k = Y1[i]; k <= Y2[i]; ++k)
          fld[j][k] = 1;
      }
    }
    // for (int i = 0; i < W; ++i) {for (int j = 0; j < H; ++j)cout << fld[i][j]
    // << ends;cout << endl;}
    int ans = 0;
    // cout << 123 << endl;
    for (int i = 0; i < W; ++i) {
      for (int j = 0; j < H; ++j) {
        if (!fld[i][j]) {
          fld[i][j] = 1;
          ++ans;
          queue<int> q;
          q.push(i * H + j);
          while (!q.empty()) {
            int ii = q.front() / H, jj = q.front() % H;
            q.pop();
            for (int k = 0; k < 4; ++k) {
              int ni = ii + dx[k], nj = jj + dy[k];
              if (ni >= 0 && ni < W && nj >= 0 && nj < H && !fld[ni][nj]) {
                fld[ni][nj] = 1;
                q.push(ni * H + nj);
              }
            }
          }
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}