Problem p01407 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mp make_pair
#define INF (1LL << 60)
typedef long long Int;

struct node {
  int x, t, p;
};
bool operator<(const node &l, const node &r) {
  return l.t != r.t ? l.t < r.t : l.x != r.x ? l.x < r.x : l.p < r.p;
}

int N, V, XL, XR;
node X[4000];

inline bool connect(int i, int j) {
  return abs(X[j].x - X[i].x) <= (long long)V * abs(X[j].t - X[i].t);
}

pair<int, int> pre[10000];
int vis[10000];
Int h[10000];
vector<int> v[4000];
vector<Int> c[4000];

inline void add_edge(int _u, int _v, Int _c) {
  v[_u].push_back(_v);
  c[_u].push_back(_c);
}

int main() {
  scanf("%d%d%d%d", &N, &V, &XL, &XR);
  X[0].x = XL;
  X[1].x = XR;
  rep(i, N) scanf("%d%d%d", &X[i + 2].x, &X[i + 2].t, &X[i + 2].p);
  N += 2;
  sort(X, X + N);
  rep(i, 2) add_edge(0, 2 + i * 2, 0);
  rep(i, N) {
    const int f = 2 + 2 * i + 1;
    add_edge(f - 1, f, -X[i].p);
    add_edge(f, 1, 0);
    for (int j = i + 1; j < N; j++)
      if (connect(i, j))
        add_edge(f, 2 + j * 2, 0);
  }
  rep(i, N) h[2 + i * 2] = INF;
  rep(i, 2) h[2 + i * 2] = 0, pre[2 + i * 2] = mp(0, i);
  rep(i, N) {
    const int f = 2 + i * 2 + 1;
    h[f] = h[f - 1] - X[i].p;
    pre[f] = mp(f - 1, 0);
    rep(j, v[f].size()) if (h[v[f][j]] > h[f]) {
      h[v[f][j]] = h[f];
      pre[v[f][j]] = mp(f, j);
    }
  }
  Int a = -h[1];
  int cur = 1;
  while (cur != 0) {
    const int f = pre[cur].first;
    const int k = pre[cur].second;
    add_edge(cur, f, -c[f][k]);
    c[f][k] = INF;
    cur = f;
  }
  priority_queue<pair<Int, int>> q;
  q.push(mp(0, 0));
  while (!q.empty()) {
    const pair<Int, int> vv(q.top());
    q.pop();
    const int cc = -vv.first;
    const int ix = vv.second;
    if (vis[ix])
      continue;
    vis[ix] = 1;
    if (ix == 1) {
      a -= h[1] + cc;
      break;
    }
    rep(i, v[ix].size()) {
      const Int nc = cc + c[ix][i] + h[ix] - h[v[ix][i]];
      if (vis[v[ix][i]] == 0)
        q.push(mp(-nc, v[ix][i]));
    }
  }
  cout << a << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mp make_pair
#define INF (1LL << 60)
typedef long long Int;

struct node {
  int x, t, p;
};
bool operator<(const node &l, const node &r) {
  return l.t != r.t ? l.t < r.t : l.x != r.x ? l.x < r.x : l.p < r.p;
}

int N, V, XL, XR;
node X[4000];

inline bool connect(int i, int j) {
  return abs(X[j].x - X[i].x) <= (long long)V * abs(X[j].t - X[i].t);
}

pair<int, int> pre[10000];
int vis[10000];
Int h[10000];
vector<int> v[10000];
vector<Int> c[10000];

inline void add_edge(int _u, int _v, Int _c) {
  v[_u].push_back(_v);
  c[_u].push_back(_c);
}

int main() {
  scanf("%d%d%d%d", &N, &V, &XL, &XR);
  X[0].x = XL;
  X[1].x = XR;
  rep(i, N) scanf("%d%d%d", &X[i + 2].x, &X[i + 2].t, &X[i + 2].p);
  N += 2;
  sort(X, X + N);
  rep(i, 2) add_edge(0, 2 + i * 2, 0);
  rep(i, N) {
    const int f = 2 + 2 * i + 1;
    add_edge(f - 1, f, -X[i].p);
    add_edge(f, 1, 0);
    for (int j = i + 1; j < N; j++)
      if (connect(i, j))
        add_edge(f, 2 + j * 2, 0);
  }
  rep(i, N) h[2 + i * 2] = INF;
  rep(i, 2) h[2 + i * 2] = 0, pre[2 + i * 2] = mp(0, i);
  rep(i, N) {
    const int f = 2 + i * 2 + 1;
    h[f] = h[f - 1] - X[i].p;
    pre[f] = mp(f - 1, 0);
    rep(j, v[f].size()) if (h[v[f][j]] > h[f]) {
      h[v[f][j]] = h[f];
      pre[v[f][j]] = mp(f, j);
    }
  }
  Int a = -h[1];
  int cur = 1;
  while (cur != 0) {
    const int f = pre[cur].first;
    const int k = pre[cur].second;
    add_edge(cur, f, -c[f][k]);
    c[f][k] = INF;
    cur = f;
  }
  priority_queue<pair<Int, int>> q;
  q.push(mp(0, 0));
  while (!q.empty()) {
    const pair<Int, int> vv(q.top());
    q.pop();
    const int cc = -vv.first;
    const int ix = vv.second;
    if (vis[ix])
      continue;
    vis[ix] = 1;
    if (ix == 1) {
      a -= h[1] + cc;
      break;
    }
    rep(i, v[ix].size()) {
      const Int nc = cc + c[ix][i] + h[ix] - h[v[ix][i]];
      if (vis[v[ix][i]] == 0)
        q.push(mp(-nc, v[ix][i]));
    }
  }
  cout << a << endl;
  return 0;
}