Problem p02673 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
namespace Base {
#define mr make_pair
typedef long long ll;
typedef double db;
const int inf = 0x3f3f3f3f, INF = 0x7fffffff;
const ll infll = 0x3f3f3f3f3f3f3f3fll, INFll = 0x7fffffffffffffffll;
template <typename T> void read(T &x) {
  x = 0;
  int fh = 1;
  double num = 1.0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-')
      fh = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  if (ch == '.') {
    ch = getchar();
    while (isdigit(ch)) {
      num /= 10;
      x = x + num * (ch - '0');
      ch = getchar();
    }
  }
  x = x * fh;
}
template <typename T> void chmax(T &x, T y) { x = x < y ? y : x; }
template <typename T> void chmin(T &x, T y) { x = x > y ? y : x; }
} // namespace Base
using namespace Base;

const int N = 400010;
ll p[N + N];
double preb[N], s[N], bakb[N], ans;
int b[N + N], n, st[N], top;

double query(int x, int y, int i) {
  int dx = i - x, dy = y - i;
  double final = 1.0 * p[x] * dy / (dx + dy) + 1.0 * p[y] * dx / (dx + dy);
  double k = ((dx - 1.0) / dx + (dy - 1.0) / dy) / 2;
  k = 1 / (1 - k);
  final = final - b[i] * k;
  double now = bakb[i + 1] - bakb[y] - (s[y - 1] - s[i]) * (n - y + 1),
         t = k / dy;
  final = final - now * t;
  now = preb[i - 1] - preb[x] - (s[i - 1] - s[x]) * x, t = k / dx;
  final = final - now * t;
  return final;
}
int main() {
  read(n);
  ll mx = 0;
  int mxi = 1;
  for (int i = 1; i <= n; i++) {
    read(p[i]);
    if (p[i] > mx)
      mx = p[i], mxi = i;
  }
  for (int i = 1; i <= n; i++)
    read(b[i]);
  for (int i = 1; i <= n; i++)
    p[i + n] = p[i], b[i + n] = b[i];
  for (int i = 1; i <= n; i++) {
    p[i] = p[mxi + i - 1], b[i] = b[mxi + i - 1];
    preb[i] = i * b[i] + preb[i - 1];
    s[i] = b[i] + s[i - 1];
  }
  for (int i = n; i >= 1; i--) {
    bakb[i] = bakb[i + 1] + (n - i + 1) * b[i];
  }
  p[n + 1] = p[1], b[n + 1] = b[1];
  st[top = 1] = 1;
  for (int i = 2; i <= n + 1; i++) {
    while (top > 1 && query(st[top - 1], i, st[top]) > p[st[top]])
      top--;
    st[++top] = i;
  }

  for (int i = 1; i < top; i++) {
    ans = ans + p[st[i]];
    for (int j = st[i] + 1; j < st[i + 1]; j++)
      ans = ans + query(st[i], st[i + 1], j);
  }
  ans = ans / n;
  printf("%.10lf\\n", ans);
  return 0;
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
namespace Base {
#define mr make_pair
typedef long long ll;
typedef double db;
const int inf = 0x3f3f3f3f, INF = 0x7fffffff;
const ll infll = 0x3f3f3f3f3f3f3f3fll, INFll = 0x7fffffffffffffffll;
template <typename T> void read(T &x) {
  x = 0;
  int fh = 1;
  double num = 1.0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-')
      fh = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  if (ch == '.') {
    ch = getchar();
    while (isdigit(ch)) {
      num /= 10;
      x = x + num * (ch - '0');
      ch = getchar();
    }
  }
  x = x * fh;
}
template <typename T> void chmax(T &x, T y) { x = x < y ? y : x; }
template <typename T> void chmin(T &x, T y) { x = x > y ? y : x; }
} // namespace Base
using namespace Base;

const int N = 200010;
ll p[N + N];
double preb[N], s[N], bakb[N], ans;
int b[N + N], n, st[N], top;

double query(int x, int y, int i) {
  int dx = i - x, dy = y - i;
  double final = 1.0 * p[x] * dy / (dx + dy) + 1.0 * p[y] * dx / (dx + dy);
  double k = ((dx - 1.0) / dx + (dy - 1.0) / dy) / 2;
  k = 1 / (1 - k);
  final = final - b[i] * k;
  double now = bakb[i + 1] - bakb[y] - (s[y - 1] - s[i]) * (n - y + 1),
         t = k / dy;
  final = final - now * t;
  now = preb[i - 1] - preb[x] - (s[i - 1] - s[x]) * x, t = k / dx;
  final = final - now * t;
  return final;
}
int main() {
  read(n);
  ll mx = 0;
  int mxi;
  for (int i = 1; i <= n; i++) {
    read(p[i]);
    if (p[i] > mx)
      mx = p[i], mxi = i;
  }
  for (int i = 1; i <= n; i++)
    read(b[i]);
  for (int i = 1; i <= n; i++)
    p[i + n] = p[i], b[i + n] = b[i];
  for (int i = 1; i <= n; i++) {
    p[i] = p[mxi + i - 1], b[i] = b[mxi + i - 1];
    preb[i] = i * b[i] + preb[i - 1];
    s[i] = b[i] + s[i - 1];
  }
  for (int i = n; i >= 1; i--) {
    bakb[i] = bakb[i + 1] + (n - i + 1) * b[i];
  }
  p[n + 1] = p[1], b[n + 1] = b[1];
  st[top = 1] = 1;
  for (int i = 2; i <= n + 1; i++) {
    while (top > 1 && query(st[top - 1], i, st[top]) > p[st[top]])
      top--;
    st[++top] = i;
  }

  for (int i = 1; i < top; i++) {
    ans = ans + p[st[i]];
    for (int j = st[i] + 1; j < st[i + 1]; j++)
      ans = ans + query(st[i], st[i + 1], j);
  }
  ans = ans / n;
  printf("%.10lf\\n", ans);
  return 0;
}