Problem p03566 (C++)

Buggy submission (status: Runtime Error):
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [Tips]
// XCodeでのEOF入力はCtrl+D
// ¥はAlt+\
// ansは結構INTの範囲2,147,483,647を超えることがあるのでlong
// long使っておいたほうが良い
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////
//
////////////////////////////////////////

// #define debug
// //*******************************************************************************************************************************************
#ifdef debug
#include <chrono>
#endif

#include <algorithm> // next_permutation
#include <cmath>
#include <cstdio>
#include <cstring> //memcpy
#include <iomanip>
#include <iostream>
#include <list>
#include <numeric> //accumulate
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
// #include <map>
// #include <unordered_map> //hash func.
#include <fstream>  //ifstream, ofstream
#include <iterator> //insert_iterator::inserter
#include <set>

// #define NDEBUG //If NDEBUG is defined before #include <cassert>, assert will
// be ignored. You had better define NDEBUG when u submit the code.
#include <cassert> //assert

using namespace std;

#define dout cout
// If u wanna output to a text file instead of standard output, plz define
// OUTPUTFILE. #define OUTPUTFILE "output.txt"
// //************************************************************
#ifdef OUTPUTFILE
#define dout outputfile
ofstream outputfile(OUTPUTFILE);
#define OutputFilePath                                                         \
  "/Users/Nag/Documents/Prgm/Test/DerivedData/Test/Build/Products/Debug/"      \
  "output.txt"
#endif

#define din cin
// If u wanna input from a text file instead of standard input, plz define
// INPUTFROMTEXTFILEを. #define INPUTFILE "input.txt"
// //**************************************************************
#ifdef INPUTFILE
#define din inputfile
ifstream inputfile(INPUTFILE);
#endif

#define scand(A) scanf("%d", &(A))
#define scans(A) scanf("%s", (A))
#define printd(A) printf("%d\n", (A))
#define prints(A) printf("%s\n", (A))
#define disp(A) dout << #A << " = " << setw(3) << (A) << endl
#define disP(A) dout << setw(3) << (A) << " "
#define rep(i, a, n) for (int(i) = (a); (i) < (n); (i)++)
#define show(A, n)                                                             \
  dout << #A << " = ";                                                         \
  rep(j, 0, (n)) { disP(A[j]); }                                               \
  dout << endl
#define showi(n)                                                               \
  dout << "i = ";                                                              \
  rep(j, 0, (n)) { disP(j); }                                                  \
  dout << endl

// #define dispAll(A,n) cout << #A << " = "; rep(j, 0, (n)) {cout << setw(3) <<
// A[j] << " ";} cout << endl

#define sign(x) ((x) > 0) - ((x) < 0) // x<0: -1, x=0: 0, x>0: +1
#define p(i) ((i) / 2)
#define l(i) ((i)*2)
#define r(i) ((i)*2 + 1)
#define sibling(i) (i ^ 1) // the other sibling of i (ex. 16^1 = 17, 17^1 = 16)
#define isRightChild(i) (i & 1)   // ex. 16&1 = 0, 17&1 = 1
#define isLeftChild(i) (!(i & 1)) // ex. 16&1 = 1, 17&1 = 0

int dx[] = {1, -1, 0,  0,
            1, 1,  -1, -1}; // 右左上下、右上から時計回りに右下、左下、左上
int dy[] = {0, 0, -1, 1, -1, 1, 1, -1};

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;

const int INF = (1LL << 31) - 1;
const ll INF_LL = (ll)9e18 - 1LL; // Be careful for overflow.
const ull INF_ULL = (ull)1e19 - 1ULL;
const int NONE = -1;
const ll MOD = (ll)1e9 + 7; // 大きい素数の代表といえばこの人、10億7さん

const int N_MAX = 110;    // num of vertex or element
const int M_MAX = 100010; // num of edge
const int DATA_MAX = 1010;

int N;
int T[N_MAX];
int V[N_MAX];
int TT[N_MAX];
vector<pair<int, int>> Xi;

void display() {
#ifdef debug
  dout << "---------------------\n";
  showi(N);
  show(T, N + 1);
  show(TT, N + 1);
  show(V, N + 1);
#endif
}

int main() {

  // cin, coutの高速化
  // ＊注意：cinを使うなら全部cinで、scanfを使うなら全部scanfで統一するように！
  cin.tie(0);                  // cinとcoutの同期を切る
  ios::sync_with_stdio(false); // iostreamとstdioの同期を切る

  // read input data
  //    scand(N);

  din >> N;

  din >> T[0];
  TT[0] = T[0];

  rep(i, 1, N) {
    din >> T[i];
    TT[i] = TT[i - 1] + T[i];
  }
  T[N] = 0;
  TT[N] = TT[N - 1];

  rep(i, 0, N) { din >> V[i]; }
  V[N] = 0;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // start timer
  auto startTime = chrono::system_clock::now();
#endif
  //------------------------------------------------------------------------------------------

#ifdef debug
  display();
#endif

  double v = 0;
  double t = 0;

  double ans = 0;

  int X;

  // calc. X[j]
  rep(i, 0, N) {
    X = V[i + 1] + TT[i];
    Xi.push_back(make_pair(X, i));
  }

  sort(Xi.begin(), Xi.end());

  // calc. ans
  int j, j_min;
  double X_min, XX_min;

  rep(i, 0, N) {

    // get X_min, j_min
    X = Xi[0].first;
    j = Xi[0].second;

    while (j < i) {
      Xi.erase(Xi.begin());
      X = Xi[0].first;
      j = Xi[0].second;
    }

    X_min = (X - v + t) / 2.0;
    XX_min = X - V[i];
    j_min = j;

#ifdef debug
    disp(X_min);
    disp(XX_min);
    disp(j_min);
#endif

    // i-a
    if (t + T[i] <= V[i] + t - v) {

      // i-a-(1)
      if (t + T[i] <= X_min) {
#ifdef debug
        dout << "i-a-(1)\n";
#endif
        ans += (v + t + T[i] - t + v) * T[i] / 2.0;
        t = t + T[i];
        v = t + T[i] - t + v;
      }

      // i-a-(2)
      else {
#ifdef debug
        dout << "i-a-(2)\n";
#endif
        assert(t <= X_min);

        ans += (v + X_min - t + v) * (X_min - t) / 2.0 +
               (X_min - t + v + V[j_min + 1]) * (TT[j_min] - X_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];

        i = j_min;
      }

    }

    // i-b
    else {

      // i-b-(1)
      if (t + T[i] <= XX_min) {
#ifdef debug
        dout << "i-b-(1)\n";
#endif
        ans += (v + V[i]) * (V[i] + t - v - t) / 2.0 +
               V[i] * (t + T[i] - (V[i] + t - v));
        t = t + T[i];
        v = V[i];
      }

      // i-b-(2)
      else if (V[i] + t - v <= XX_min) {
#ifdef debug
        dout << "i-b-(2)\n";
#endif
        ans += (v + V[i]) * (V[i] + t - v - t) / 2.0 +
               V[i] * (XX_min - (V[i] + t - v)) +
               (V[i] + V[j_min + 1]) * (TT[j_min] - XX_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];
        i = j_min;
      }

      // i-b-(3)
      else {
#ifdef debug
        dout << "i-b-(3)\n";
#endif
        assert(t <= XX_min);

        ans += (v + X_min - t + v) * (X_min - t) / 2.0 +
               (X_min - t + v + V[j_min + 1]) * (TT[j_min] - X_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];

        i = j_min;
      }
    }
#ifdef debug
    disp(ans);
    dout << endl;
#endif
  }

#ifdef debug
  dout << "=== OUTPUT ===\n";
#endif
  dout << fixed << setprecision(6) << ans << endl;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // stop timer
  auto endTime = chrono::system_clock::now();
  auto dur = endTime - startTime;
  auto msec = chrono::duration_cast<chrono::milliseconds>(dur).count();
  dout << fixed << setprecision(4) << (double)msec / 1000 << " sec \n";
#endif
  //------------------------------------------------------------------------------------------

#ifdef INPUTFILE
  inputfile.close();
#endif

#ifdef OUTPUTFILE
  outputfile.close();
  cout << "\"" << OutputFilePath << "\"" << endl;
#endif

  return 0;
}


Fixed submission:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [Tips]
// XCodeでのEOF入力はCtrl+D
// ¥はAlt+\
// ansは結構INTの範囲2,147,483,647を超えることがあるのでlong
// long使っておいたほうが良い
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////
//
////////////////////////////////////////

// #define debug
// //*******************************************************************************************************************************************
#ifdef debug
#include <chrono>
#endif

#include <algorithm> // next_permutation
#include <cmath>
#include <cstdio>
#include <cstring> //memcpy
#include <iomanip>
#include <iostream>
#include <list>
#include <numeric> //accumulate
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
// #include <map>
// #include <unordered_map> //hash func.
#include <fstream>  //ifstream, ofstream
#include <iterator> //insert_iterator::inserter
#include <set>

#define NDEBUG // If NDEBUG is defined before #include <cassert>, assert will be
               // ignored. You had better define NDEBUG when u submit the code.
#include <cassert> //assert

using namespace std;

#define dout cout
// If u wanna output to a text file instead of standard output, plz define
// OUTPUTFILE. #define OUTPUTFILE "output.txt"
// //************************************************************
#ifdef OUTPUTFILE
#define dout outputfile
ofstream outputfile(OUTPUTFILE);
#define OutputFilePath                                                         \
  "/Users/Nag/Documents/Prgm/Test/DerivedData/Test/Build/Products/Debug/"      \
  "output.txt"
#endif

#define din cin
// If u wanna input from a text file instead of standard input, plz define
// INPUTFROMTEXTFILEを. #define INPUTFILE "input.txt"
// //**************************************************************
#ifdef INPUTFILE
#define din inputfile
ifstream inputfile(INPUTFILE);
#endif

#define scand(A) scanf("%d", &(A))
#define scans(A) scanf("%s", (A))
#define printd(A) printf("%d\n", (A))
#define prints(A) printf("%s\n", (A))
#define disp(A) dout << #A << " = " << setw(3) << (A) << endl
#define disP(A) dout << setw(3) << (A) << " "
#define rep(i, a, n) for (int(i) = (a); (i) < (n); (i)++)
#define show(A, n)                                                             \
  dout << #A << " = ";                                                         \
  rep(j, 0, (n)) { disP(A[j]); }                                               \
  dout << endl
#define showi(n)                                                               \
  dout << "i = ";                                                              \
  rep(j, 0, (n)) { disP(j); }                                                  \
  dout << endl

// #define dispAll(A,n) cout << #A << " = "; rep(j, 0, (n)) {cout << setw(3) <<
// A[j] << " ";} cout << endl

#define sign(x) ((x) > 0) - ((x) < 0) // x<0: -1, x=0: 0, x>0: +1
#define p(i) ((i) / 2)
#define l(i) ((i)*2)
#define r(i) ((i)*2 + 1)
#define sibling(i) (i ^ 1) // the other sibling of i (ex. 16^1 = 17, 17^1 = 16)
#define isRightChild(i) (i & 1)   // ex. 16&1 = 0, 17&1 = 1
#define isLeftChild(i) (!(i & 1)) // ex. 16&1 = 1, 17&1 = 0

int dx[] = {1, -1, 0,  0,
            1, 1,  -1, -1}; // 右左上下、右上から時計回りに右下、左下、左上
int dy[] = {0, 0, -1, 1, -1, 1, 1, -1};

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;

const int INF = (1LL << 31) - 1;
const ll INF_LL = (ll)9e18 - 1LL; // Be careful for overflow.
const ull INF_ULL = (ull)1e19 - 1ULL;
const int NONE = -1;
const ll MOD = (ll)1e9 + 7; // 大きい素数の代表といえばこの人、10億7さん

const int N_MAX = 110;    // num of vertex or element
const int M_MAX = 100010; // num of edge
const int DATA_MAX = 1010;

int N;
int T[N_MAX];
int V[N_MAX];
int TT[N_MAX];
vector<pair<int, int>> Xi;

void display() {
#ifdef debug
  dout << "---------------------\n";
  showi(N);
  show(T, N + 1);
  show(TT, N + 1);
  show(V, N + 1);
#endif
}

int main() {

  // cin, coutの高速化
  // ＊注意：cinを使うなら全部cinで、scanfを使うなら全部scanfで統一するように！
  cin.tie(0);                  // cinとcoutの同期を切る
  ios::sync_with_stdio(false); // iostreamとstdioの同期を切る

  // read input data
  //    scand(N);

  din >> N;

  din >> T[0];
  TT[0] = T[0];

  rep(i, 1, N) {
    din >> T[i];
    TT[i] = TT[i - 1] + T[i];
  }
  T[N] = 0;
  TT[N] = TT[N - 1];

  rep(i, 0, N) { din >> V[i]; }
  V[N] = 0;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // start timer
  auto startTime = chrono::system_clock::now();
#endif
  //------------------------------------------------------------------------------------------

#ifdef debug
  display();
#endif

  double v = 0;
  double t = 0;

  double ans = 0;

  int X;

  // calc. X[j]
  rep(i, 0, N) {
    X = V[i + 1] + TT[i];
    Xi.push_back(make_pair(X, i));
  }

  sort(Xi.begin(), Xi.end());

  // calc. ans
  int j, j_min;
  double X_min, XX_min;

  rep(i, 0, N) {

    // get X_min, j_min
    X = Xi[0].first;
    j = Xi[0].second;

    while (j < i) {
      Xi.erase(Xi.begin());
      X = Xi[0].first;
      j = Xi[0].second;
    }

    X_min = (X - v + t) / 2.0;
    XX_min = X - V[i];
    j_min = j;

#ifdef debug
    disp(X_min);
    disp(XX_min);
    disp(j_min);
#endif

    // i-a
    if (t + T[i] <= V[i] + t - v) {

      // i-a-(1)
      if (t + T[i] <= X_min) {
#ifdef debug
        dout << "i-a-(1)\n";
#endif
        ans += (v + t + T[i] - t + v) * T[i] / 2.0;
        t = t + T[i];
        v = t + T[i] - t + v;
      }

      // i-a-(2)
      else {
#ifdef debug
        dout << "i-a-(2)\n";
#endif
        assert(t <= X_min);

        ans += (v + X_min - t + v) * (X_min - t) / 2.0 +
               (X_min - t + v + V[j_min + 1]) * (TT[j_min] - X_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];

        i = j_min;
      }

    }

    // i-b
    else {

      // i-b-(1)
      if (t + T[i] <= XX_min) {
#ifdef debug
        dout << "i-b-(1)\n";
#endif
        ans += (v + V[i]) * (V[i] + t - v - t) / 2.0 +
               V[i] * (t + T[i] - (V[i] + t - v));
        t = t + T[i];
        v = V[i];
      }

      // i-b-(2)
      else if (V[i] + t - v <= XX_min) {
#ifdef debug
        dout << "i-b-(2)\n";
#endif
        ans += (v + V[i]) * (V[i] + t - v - t) / 2.0 +
               V[i] * (XX_min - (V[i] + t - v)) +
               (V[i] + V[j_min + 1]) * (TT[j_min] - XX_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];
        i = j_min;
      }

      // i-b-(3)
      else {
#ifdef debug
        dout << "i-b-(3)\n";
#endif
        assert(t <= XX_min);

        ans += (v + X_min - t + v) * (X_min - t) / 2.0 +
               (X_min - t + v + V[j_min + 1]) * (TT[j_min] - X_min) / 2.0;
        t = TT[j_min];
        v = V[j_min + 1];

        i = j_min;
      }
    }
#ifdef debug
    disp(ans);
    dout << endl;
#endif
  }

#ifdef debug
  dout << "=== OUTPUT ===\n";
#endif
  dout << fixed << setprecision(6) << ans << endl;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // stop timer
  auto endTime = chrono::system_clock::now();
  auto dur = endTime - startTime;
  auto msec = chrono::duration_cast<chrono::milliseconds>(dur).count();
  dout << fixed << setprecision(4) << (double)msec / 1000 << " sec \n";
#endif
  //------------------------------------------------------------------------------------------

#ifdef INPUTFILE
  inputfile.close();
#endif

#ifdef OUTPUTFILE
  outputfile.close();
  cout << "\"" << OutputFilePath << "\"" << endl;
#endif

  return 0;
}