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

#include <algorithm>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define LOG(...) printf(__VA_ARGS__)
// #define LOG(...)
#define FOR(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define EXIST(s, e) ((s).find(e) != (s).end())
#define SORT(c) sort((c).begin(), (c).end())
#define RSORT(c) sort((c).rbegin(), (c).rend())
#define CLR(a) memset((a), 0, sizeof(a))

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
/*交点の座標を求めるプログラム
　点をpとし、p0の座標を(x0,y0)とする
 　Inputは x0 y0 x1 y1 x2 y2 x3 y3
  p0とp1、p2とp3はつながっている*/
double x[100][2];
double y[100][2];
int n;
struct Pos2 {
  double x;
  double y;
};

int main() {
  while (cin >> n, n) {
    int count = 1; // 交点の数を記憶
    for (int i = 0; i < n; i++) {
      cin >> x[i][0] >> y[i][0] >> x[i][1] >> y[i][1];
      // cout << x[i][0] << y[i][0] << x[i][1] << y[i][1]<<endl;
    }
    for (int i = 0; i < n; i++) {
      vector<Pos2> p;
      for (int j = i + 1; j < n; j++) {
        double d = (x[i][1] - x[i][0]) * (y[j][1] - y[j][0]) -
                   (y[i][1] - y[i][0]) * (x[j][1] - x[j][0]); // 平行チェック
        if (d != 0) {
          double a0 = ((y[j][1] - y[j][0]) * (x[j][0] - x[i][0]) -
                       (x[j][1] - x[j][0]) * (y[j][0] - y[i][0])) /
                      d; // iの直線のどこで交わっているか
          double a2 = ((y[i][1] - y[i][0]) * (x[j][0] - x[i][0]) -
                       (x[i][1] - x[i][0]) * (y[j][0] - y[i][0])) /
                      d; // jの直線のどこで交わっているか
          if (0.0 < a0 && a0 < 1.0 && 0.0 < a2 &&
              a2 <
                  1.0) { // どちらもが線分内で交わっているか判定（辺上で交わるのは除外）
            double ansx = x[i][0] + (x[i][1] - x[i][0]) * a0;
            double ansy = y[i][0] + (y[i][1] - y[i][0]) * a0;
            bool b = true;
            for (int k = 0; k < p.size(); k++) {
              if (abs(p[k].x - ansx) < 1e-10 && abs(p[k].y - ansy) < 1e-10) {
                b = false;
                break;
              }
            }
            if (b) {
              p.push_back({ansx, ansy});
            }
          }
        }
      }
      count += p.size() + 1;
    }
    cout << count << endl; // 領域を出力
  }
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define LOG(...) printf(__VA_ARGS__)
// #define LOG(...)
#define FOR(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define EXIST(s, e) ((s).find(e) != (s).end())
#define SORT(c) sort((c).begin(), (c).end())
#define RSORT(c) sort((c).rbegin(), (c).rend())
#define CLR(a) memset((a), 0, sizeof(a))

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
/*交点の座標を求めるプログラム
　点をpとし、p0の座標を(x0,y0)とする
 　Inputは x0 y0 x1 y1 x2 y2 x3 y3
  p0とp1、p2とp3はつながっている*/
double x[100][2];
double y[100][2];
int n;
struct Pos2 {
  double x;
  double y;
};
vector<Pos2> p;
int main() {
  while (cin >> n, n) {
    int count = 0; // 交点の数を記憶
    for (int i = 0; i < n; i++) {
      cin >> x[i][0] >> y[i][0] >> x[i][1] >> y[i][1];
      // cout << x[i][0] << y[i][0] << x[i][1] << y[i][1]<<endl;
    }
    for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) {
        double d = (x[i][1] - x[i][0]) * (y[j][1] - y[j][0]) -
                   (y[i][1] - y[i][0]) * (x[j][1] - x[j][0]); // 平行チェック
        if (d != 0) {
          double a0 = ((y[j][1] - y[j][0]) * (x[j][0] - x[i][0]) -
                       (x[j][1] - x[j][0]) * (y[j][0] - y[i][0])) /
                      d; // iの直線のどこで交わっているか
          double a2 = ((y[i][1] - y[i][0]) * (x[j][0] - x[i][0]) -
                       (x[i][1] - x[i][0]) * (y[j][0] - y[i][0])) /
                      d; // jの直線のどこで交わっているか
          if (0.0 < a0 && a0 < 1.0 && 0.0 < a2 &&
              a2 <
                  1.0) { // どちらもが線分内で交わっているか判定（辺上で交わるのは除外）
            double ansx = x[i][0] + (x[i][1] - x[i][0]) * a0;
            double ansy = y[i][0] + (y[i][1] - y[i][0]) * a0;
            bool b = true;
            for (int k = 0; k < p.size(); k++) {
              if (p[k].x == ansx && p[k].y == ansy) {
                b = false;
                break;
              }
            }
            if (b) {
              p.push_back({ansx, ansy});
              count++;
            }
          }
        }
      }
    }
    cout << 1 + n + count << endl; // 領域を出力
  }
}