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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define SF scanf
#define PF printf
#define MAXN 1100
using namespace std;
int n, wt, ht;
int xs1[MAXN], ys1[MAXN], xs2[MAXN], ys2[MAXN];
int fld[MAXN * 2][MAXN * 2];
int w[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    int t1 = x1[i];
    int t2 = x2[i];
    if (1 <= t1 && t1 < w)
      xs.push_back(t1);
    if (1 <= t2 && t2 < w)
      xs.push_back(t2);
  }
  xs.push_back(0);
  xs.push_back(w);
  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(); // £¨????????find??????±?????????£?£?£?????×?±?
  }
  return xs.size() - 1; //?????????¶?§
}
void bfs(int x, int y) {
  queue<pair<int, int>> q;
  q.push(make_pair(x, y));
  while (!q.empty()) {
    pair<int, int> nxt = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      int x1 = nxt.first + w[i][0];
      int y1 = nxt.second + w[i][1];
      if (x1 >= 0 && x1 < wt && y1 >= 0 && y1 <= ht && fld[x1][y1] == 0) {
        fld[x1][y1] = 1;
        q.push(make_pair(x1, y1));
      }
    }
  }
}
int main() {
  while (SF("%d %d", &wt, &ht) != EOF) {
    memset(fld, 0, sizeof fld);
    if (wt == 0 || ht == 0)
      break;
    SF("%d", &n);
    for (int i = 0; i < n; i++)
      SF("%d%d%d%d", &xs1[i], &ys1[i], &xs2[i], &ys2[i]);
    wt = compress(xs1, xs2, wt);
    ht = compress(ys1, ys2, ht);
    //????????????imos£¬????????????????£¬????????????????´????°×???
    //??°×??????????sum????±?????????£¬??°´??×???????????´?´????°×???
    for (int i = 0; i < n; i++) {
      fld[xs1[i]][ys1[i]]++;
      fld[xs2[i]][ys1[i]]--;
      fld[xs1[i]][ys2[i]]--;
      fld[xs2[i]][ys2[i]]++;
    }
    for (int i = 0; i < wt; i++)
      for (int j = 1; j < ht; j++)
        fld[i][j] += fld[i][j - 1];
    for (int i = 1; i < wt; i++)
      for (int j = 0; j < ht; j++)
        fld[i][j] += fld[i - 1][j];
    int tot = 0;
    for (int i = 0; i < wt; i++)
      for (int j = 0; j < ht; j++)
        if (fld[i][j] == 0) {
          // dfs(i,j);
          // ±??????????´??bfs?£?£?±??±¬????´???????????
          bfs(i, j);
          tot++;
        }
    PF("%d\\n", tot);
  }
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define SF scanf
#define PF printf
#define MAXN 2010
using namespace std;
int n, wt, ht;
int xs1[MAXN], ys1[MAXN], xs2[MAXN], ys2[MAXN];
int fld[MAXN * 2][MAXN * 2];
int w[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    int t1 = x1[i];
    int t2 = x2[i];
    if (1 <= t1 && t1 < w)
      xs.push_back(t1);
    if (1 <= t2 && t2 < w)
      xs.push_back(t2);
  }
  xs.push_back(0);
  xs.push_back(w);
  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(); // £¨????????find??????±?????????£?£?£?????×?±?
  }
  return xs.size() - 1; //?????????¶?§
}
void bfs(int x, int y) {
  queue<pair<int, int>> q;
  q.push(make_pair(x, y));
  while (!q.empty()) {
    pair<int, int> nxt = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      int x1 = nxt.first + w[i][0];
      int y1 = nxt.second + w[i][1];
      if (x1 >= 0 && x1 < wt && y1 >= 0 && y1 <= ht && fld[x1][y1] == 0) {
        fld[x1][y1] = 1;
        q.push(make_pair(x1, y1));
      }
    }
  }
}
int main() {
  while (SF("%d %d", &wt, &ht) != EOF) {
    memset(fld, 0, sizeof fld);
    if (wt == 0 || ht == 0)
      break;
    SF("%d", &n);
    for (int i = 0; i < n; i++)
      SF("%d%d%d%d", &xs1[i], &ys1[i], &xs2[i], &ys2[i]);
    wt = compress(xs1, xs2, wt);
    ht = compress(ys1, ys2, ht);
    //????????????imos£¬????????????????£¬????????????????´????°×???
    //??°×??????????sum????±?????????£¬??°´??×???????????´?´????°×???
    for (int i = 0; i < n; i++) {
      fld[xs1[i]][ys1[i]]++;
      fld[xs2[i]][ys1[i]]--;
      fld[xs1[i]][ys2[i]]--;
      fld[xs2[i]][ys2[i]]++;
    }
    for (int i = 0; i < wt; i++)
      for (int j = 0; j < ht; j++)
        fld[i][j] += fld[i][j - 1];
    for (int i = 0; i < wt; i++)
      for (int j = 0; j < ht; j++)
        fld[i][j] += fld[i - 1][j];
    int tot = 0;
    for (int i = 0; i < wt; i++)
      for (int j = 0; j < ht; j++)
        if (fld[i][j] == 0) {
          // dfs(i,j);
          // ±??????????´??bfs?£?£?±??±¬????´???????????
          bfs(i, j);
          tot++;
        }
    PF("%d\\n", tot);
  }
}