Problem p03566 (C++)

Buggy submission (status: Runtime Error):
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int descending_compare(const void *a, const void *b) {
  if (*(int *)a > *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}

int ascending_compare(const void *a, const void *b) {
  if (*(int *)a < *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}

// array pointer = *a, num of element = n, key key
int lower_bound(int *a, int n, int key) {
  int ng, mid, ok;
  ng = -1, ok = n - 1;
  while (abs(ok - ng) > 1) {
    mid = (ok + ng) / 2;
    if (key <= a[mid]) {
      ok = mid;
    } else {
      ng = mid;
    }
  }
  if (a[ok] >= key)
    return ok;
  return n;
}

// greatest common divisor
unsigned long gcd(unsigned long x, unsigned long y) {
  if (y == 0) {
    return x;
  } else if (x > y) {
    return gcd(y, x % y);
  } else {
    return gcd(x, y % x);
  }
}

unsigned long lcm(unsigned long x, unsigned long y) {
  unsigned long g = gcd(x, y);
  return x * y / g;
}

long long factorial(int x) {
  long long rtn = 1;
  int i;
  for (i = x; i > 1; i--) {
    rtn = (rtn * i);
  }
  return rtn;
}

/*
int struct_ascending_compare(const void *p, const void *q) {
return ((struct_name*)p)->member_name - ((struct_name*)q)->member_name;
}*/

/*unsigned long long pascal[100][100] = {0};
void make_pascal(void){
    for (int i = 0; i < 100; i++){
        pascal[i][0] = 1;
    }
    pascal[1][1] = 1;
    for (int i = 2; i < 100; i++){
        for (int j = 1; j < 100; j++){
           pascal[i][j] = (pascal[i-1][j-1]+pascal[i-1][j]) % mod;
        }
    }
}*/
long long mod = 1000000007;

// x ^ n
long long mod_pow(long long x, long long n) {
  long long res = 1;
  for (int i = 0; i < 60; i++) {
    if (n >> i & 1)
      res = res * x % mod;
    x = x * x % mod;
  }
  return res;
}

double speed[10000];
int t[105];
int v[105];

int main(void) {
  int n;
  int total = 0;
  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    scanf("%d", &t[i]);
    total += t[i];
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &v[i]);
  }
  int crt = 0;
  speed[crt] = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 1; j <= t[i] * 2; j++) {
      if (!(crt + j))
        continue;
      if (speed[crt + j - 1] + 0.5 <= v[i])
        speed[crt + j] = speed[crt + j - 1] + 0.5;
      else
        speed[crt + j] = v[i];
    }
    crt += t[i] * 2;
  }
  total *= 2;
  crt = total;
  speed[crt] = 0;
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 1; j <= t[i] * 2; j++) {
      if (speed[crt - j + 1] + 0.5 <= v[i] &&
          speed[crt - j + 1] + 0.5 <= speed[crt - j])
        speed[crt - j] = speed[crt - j + 1] + 0.5;
      else
        speed[crt - j] = speed[crt - j] > v[i] ? v[i] : speed[crt - j];
    }
    crt -= t[i] * 2;
  }
  double ans = 0;

  for (int i = 0; i <= total; i++) {
    ans += speed[i];
  }
  printf("%f\n", ans / 2);

  return 0;
}


Fixed submission:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int descending_compare(const void *a, const void *b) {
  if (*(int *)a > *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}

int ascending_compare(const void *a, const void *b) {
  if (*(int *)a < *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}

// array pointer = *a, num of element = n, key key
int lower_bound(int *a, int n, int key) {
  int ng, mid, ok;
  ng = -1, ok = n - 1;
  while (abs(ok - ng) > 1) {
    mid = (ok + ng) / 2;
    if (key <= a[mid]) {
      ok = mid;
    } else {
      ng = mid;
    }
  }
  if (a[ok] >= key)
    return ok;
  return n;
}

// greatest common divisor
unsigned long gcd(unsigned long x, unsigned long y) {
  if (y == 0) {
    return x;
  } else if (x > y) {
    return gcd(y, x % y);
  } else {
    return gcd(x, y % x);
  }
}

unsigned long lcm(unsigned long x, unsigned long y) {
  unsigned long g = gcd(x, y);
  return x * y / g;
}

long long factorial(int x) {
  long long rtn = 1;
  int i;
  for (i = x; i > 1; i--) {
    rtn = (rtn * i);
  }
  return rtn;
}

/*
int struct_ascending_compare(const void *p, const void *q) {
return ((struct_name*)p)->member_name - ((struct_name*)q)->member_name;
}*/

/*unsigned long long pascal[100][100] = {0};
void make_pascal(void){
    for (int i = 0; i < 100; i++){
        pascal[i][0] = 1;
    }
    pascal[1][1] = 1;
    for (int i = 2; i < 100; i++){
        for (int j = 1; j < 100; j++){
           pascal[i][j] = (pascal[i-1][j-1]+pascal[i-1][j]) % mod;
        }
    }
}*/
long long mod = 1000000007;

// x ^ n
long long mod_pow(long long x, long long n) {
  long long res = 1;
  for (int i = 0; i < 60; i++) {
    if (n >> i & 1)
      res = res * x % mod;
    x = x * x % mod;
  }
  return res;
}

double speed[100000];
int t[105];
int v[105];

int main(void) {
  int n;
  int total = 0;
  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    scanf("%d", &t[i]);
    total += t[i];
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &v[i]);
  }
  int crt = 0;
  speed[crt] = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 1; j <= t[i] * 2; j++) {
      if (!(crt + j))
        continue;
      if (speed[crt + j - 1] + 0.5 <= v[i])
        speed[crt + j] = speed[crt + j - 1] + 0.5;
      else
        speed[crt + j] = v[i];
    }
    crt += t[i] * 2;
  }
  total *= 2;
  crt = total;
  speed[crt] = 0;
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 1; j <= t[i] * 2; j++) {
      if (speed[crt - j + 1] + 0.5 <= v[i] &&
          speed[crt - j + 1] + 0.5 <= speed[crt - j])
        speed[crt - j] = speed[crt - j + 1] + 0.5;
      else
        speed[crt - j] = speed[crt - j] > v[i] ? v[i] : speed[crt - j];
    }
    crt -= t[i] * 2;
  }
  double ans = 0;

  for (int i = 0; i <= total; i++) {
    ans += speed[i];
  }
  printf("%f\n", ans / 2);

  return 0;
}