Problem p01453 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
char str[600][600];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
long double ijk[600][600];
long double ijk2[600][600];
long double eps = 1e-10L;
pair<long double, pair<int, int>> v[1000000];
int t[600][600];
int main() {
  int a, b;
  scanf("%d%d", &b, &a);
  for (int i = 0; i < a; i++)
    scanf("%s", str[i]);
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
      ijk[i][j] = ijk2[i][j] = 1e20L;
  int sr, sc, gr, gc;
  queue<pair<int, int>> Q;
  int cnt = 0;
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < b; j++) {
      if (str[i][j] == 's') {
        sr = i;
        sc = j;
      }
      if (str[i][j] == 'g') {
        gr = i;
        gc = j;
        ijk[i][j] = 0;
        Q.push(make_pair(i, j));
      }
    }
  }
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
      if (str[i][j] != '#' && str[i][j] != '*' && str[i][j] != 'g')
        cnt++;
  while (Q.size()) {
    int row = Q.front().first;
    int col = Q.front().second;
    Q.pop();
    for (int i = 0; i < 4; i++) {
      if (0 <= row + dx[i] && row + dx[i] < a && 0 <= col + dy[i] &&
          col + dy[i] < b && str[row + dx[i]][col + dy[i]] != '#' &&
          str[row + dx[i]][col + dy[i]] != '*' &&
          ijk[row + dx[i]][col + dy[i]] > eps + ijk[row][col] + 1) {
        ijk[row + dx[i]][col + dy[i]] = ijk[row][col] + 1;
        Q.push(make_pair(row + dx[i], col + dy[i]));
      }
    }
  }
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++) {
      if (str[i][j] == '*') {
        ijk2[i][j] = 0;
        Q.push(make_pair(i, j));
      }
    }
  while (Q.size()) {
    int row = Q.front().first;
    int col = Q.front().second;
    Q.pop();
    for (int i = 0; i < 4; i++) {
      if (0 <= row + dx[i] && row + dx[i] < a && 0 <= col + dy[i] &&
          col + dy[i] < b && str[row + dx[i]][col + dy[i]] != '#' &&
          str[row + dx[i]][col + dy[i]] != '*' &&
          ijk2[row + dx[i]][col + dy[i]] > eps + ijk2[row][col] + 1) {
        ijk2[row + dx[i]][col + dy[i]] = ijk2[row][col] + 1;
        Q.push(make_pair(row + dx[i], col + dy[i]));
      }
    }
  }
  int sz = 0;

  long double L = 0;
  long double R = 0;
  int n = 0;
  int m = 0;
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < b; j++) {
      if (str[i][j] == 's' || str[i][j] == '.') {
        if (ijk[i][j] < 1e10L && ijk2[i][j] < 1e10L)
          v[sz++] = make_pair(ijk[i][j] - ijk2[i][j], make_pair(i, j));
        else if (ijk[i][j] < 1e10L) {
          n++;
          L += ijk[i][j];
        } else if (ijk2[i][j] < 1e10L) {
          m++;
          R += ijk2[i][j];
        }
      }
    }
  }
  std::sort(v, v + sz);
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++) {
      if (ijk[i][j] < 1e10L && ijk2[i][j] < 1e10L)
        if (str[i][j] == 's' || str[i][j] == '.')
          R += ijk2[i][j];
    }
  long double ret = ijk[sr][sc];
  //	for(int i=0;i<a;i++)for(int j=0;j<b;j++)
  //	printf("%d %d: %Lf %Lf\\n",i,j,ijk[i][j],ijk2[i][j]);
  for (int i = 0; i <= sz; i++) {
    if (t[sr][sc]) {
      break;
    }
    if (n + i) {
      //	printf("%d: %Lf\\n",i,ijk2[sr][sc]+R/(sz-i)*((long
      //double)sz/i-1)+L/(n+i));
      ret = min(ret, ijk2[sr][sc] +
                         R / (m + sz - i) *
                             ((long double)(sz + m + n) / (n + i) - 1) +
                         L / (n + i));
    }
    if (i < sz) {
      t[v[i].second.first][v[i].second.second] = 1;
      L += ijk[v[i].second.first][v[i].second.second];
      R -= ijk2[v[i].second.first][v[i].second.second];
    }
  }
  printf("%.12Lf\\n", ret);
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
char str[600][600];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
double ijk[600][600];
int v[600][600];
double eps = 1e-12;
int main() {
  int a, b;
  scanf("%d%d", &b, &a);
  for (int i = 0; i < a; i++)
    scanf("%s", str[i]);
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
      ijk[i][j] = 1e20;
  int sr, sc, gr, gc;
  queue<pair<int, int>> Q;
  int cnt = 0;
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < b; j++) {
      if (str[i][j] == 's') {
        sr = i;
        sc = j;
      }
      if (str[i][j] == 'g') {
        gr = i;
        gc = j;
        ijk[i][j] = 0;
        Q.push(make_pair(i, j));
      }
    }
  }
  for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
      if (str[i][j] != '#' && str[i][j] != '*' && str[i][j] != 'g')
        cnt++;
  while (Q.size()) {
    int row = Q.front().first;
    int col = Q.front().second;
    Q.pop();
    for (int i = 0; i < 4; i++) {
      if (0 <= row + dx[i] && row + dx[i] < a && 0 <= col + dy[i] &&
          col + dy[i] < b && str[row + dx[i]][col + dy[i]] != '#' &&
          str[row + dx[i]][col + dy[i]] != '*' &&
          ijk[row + dx[i]][col + dy[i]] > eps + ijk[row][col] + 1) {
        ijk[row + dx[i]][col + dy[i]] = ijk[row][col] + 1;
        Q.push(make_pair(row + dx[i], col + dy[i]));
      }
    }
  }
  bool upd = false;
  do {
    upd = false;
    double val = 0;
    for (int i = 0; i < a; i++)
      for (int j = 0; j < b; j++)
        if (str[i][j] != '#' && str[i][j] != '*' && str[i][j] != 'g')
          val += ijk[i][j];
    val /= cnt;
    for (int i = 0; i < a; i++)
      for (int j = 0; j < b; j++) {
        if (str[i][j] == '*') {
          ijk[i][j] = val;
          Q.push(make_pair(i, j));
        }
      }

    while (Q.size()) {
      int row = Q.front().first;
      int col = Q.front().second;
      Q.pop();
      for (int i = 0; i < 4; i++) {
        if (0 <= row + dx[i] && row + dx[i] < a && 0 <= col + dy[i] &&
            col + dy[i] < b && str[row + dx[i]][col + dy[i]] != '#' &&
            str[row + dx[i]][col + dy[i]] != '*' &&
            ijk[row + dx[i]][col + dy[i]] > eps + ijk[row][col] + 1) {
          upd = true;
          ijk[row + dx[i]][col + dy[i]] = ijk[row][col] + 1;
          Q.push(make_pair(row + dx[i], col + dy[i]));
        }
      }
    }
    /*	for(int i=0;i<a;i++){
                    for(int j=0;j<b;j++)printf("%f ",ijk[i][j]);
                    printf("\\n");
            }*/
  } while (upd);
  printf("%.12f\\n", ijk[sr][sc]);
}