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


#include <algorithm>
#include <cmath>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> PLL;
typedef pair<int, ll> Pil;
const ll INF = 0x3f3f3f3f;
const double inf = 1e8 + 100;
const double eps = 1e-8;
const ll maxn = 1e3 + 200;
const int N = 1e4 + 10;
const ll mod = 1000007;
//
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
int fld[2 * maxn][2 * maxn];
int X1[maxn], X2[maxn], Y1[maxn], Y2[maxn];
int W, H, n;
//
int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  //
  for (int i = 0; i < n; i++) {
    int tx1 = x1[i], tx2 = x2[i];
    if (1 <= tx1 && tx1 < w)
      xs.push_back(tx1);
    if (1 <= tx2 && tx2 < w)
      xs.push_back(tx2);
  }
  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();
  }
  return xs.size() - 1;
}
//
int bfs() {
  int ans = 0;
  //
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (fld[i][j])
        continue;
      ans++;
      queue<pair<int, int>> q;
      q.push(make_pair(j, i));
      while (!q.empty()) {
        int sx = q.front().first, sy = q.front().second;
        q.pop();
        //
        for (int k = 0; k < 4; k++) {
          int tx = sx + dx[k], ty = sy + dy[k];
          if (tx < 0 || W < tx || ty < 0 || H < ty || fld[ty][tx] > 0)
            continue;
          q.push(make_pair(tx, ty));
          fld[ty][tx] = 1;
        }
      }
    }
  }
  return ans;
}
//
void solve() {
  int i, j, tt = 1;
  while (cin >> W >> H && W && H) {
    cin >> n;
    for (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 (i = 0; i < n; i++) {
      fld[Y1[i]][X1[i]]++;
      fld[Y2[i]][X2[i]]++;
      fld[Y1[i]][X2[i]]--;
      fld[Y2[i]][X1[i]]--;
    }
    //
    for (i = 0; i < H; i++) {
      for (j = 1; j < W; j++) {
        fld[i][j] += fld[i][j - 1];
      }
    }
    for (i = 1; i < H; i++) {
      for (j = 0; j < W; j++) {
        fld[i][j] += fld[i - 1][j];
      }
    }
    //
    cout << bfs() << endl;
  }
}

int main() {
  solve();
  return 0;
}


Error: MLE

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[6 * MAX_N][6 * MAX_N], // 填充遍历用，代表坐标(i, j)处是否空白（压缩后）
    dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};

// 压缩坐标，将坐标的值变成“这是第几种值”，返回一共有几种坐标
int compress(int *x1, int *x2, int w) {
  vector<int> xs;

  for (int i = 0; i < N; ++i) {
    for (int d = -1; d <= 1; d++) {
      int tx1 = x1[i] + d, tx2 = x2[i] + d;
      if (1 <= tx1 && tx1 < w)
        xs.push_back(tx1);
      if (1 <= tx2 && tx2 < w)
        xs.push_back(tx2);
    }
  }
  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();
  }
  return xs.size() - 1;
}

int bfs() {
  int ans = 0;
  for (int i = 0; i < H; ++i) {
    for (int j = 0; j < W; ++j) {
      if (fld[i][j])
        continue;
      ++ans;
      queue<pair<int, int>> que;
      que.push(make_pair(j, i));
      while (!que.empty()) {
        int nx = que.front().first, ny = que.front().second;
        que.pop();

        for (int i = 0; i < 4; ++i) {
          int tx = nx + dx[i], ty = ny + dy[i];
          if (tx < 0 || W < tx || ty < 0 || H < ty || fld[ty][tx] > 0)
            continue;
          que.push(make_pair(tx, ty));
          fld[ty][tx] = 1;
        }
      }
    }
  }
  return ans;
}

///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[]) {
  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);

    // imos-法
    for (int i = 0; i < N; i++) {
      fld[Y1[i]][X1[i]]++;
      fld[Y1[i]][X2[i]]--;
      fld[Y2[i]][X1[i]]--;
      fld[Y2[i]][X2[i]]++;
    }
    // 横向累积
    for (int i = 0; i < H; i++) {
      for (int j = 1; j < W; j++) {
        fld[i][j] += fld[i][j - 1];
      }
    }
    // 纵向累积
    for (int i = 1; i < H; i++) {
      for (int j = 0; j < W; j++) {
        fld[i][j] += fld[i - 1][j];
      }
    } // 累积完后，fld中非0部分表示有挡板
    cout << bfs() << endl;
  }
  return 0;
}