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

#include <bits/stdc++.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using namespace std;

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

using edge = struct {
  int to, cap, cost, rev;
};
using G = vector<vector<edge>>;
const int inf = 1 << 29;

void add_edge(G &graph, int a, int b, int c, int d) {
  graph[a].push_back({b, c, d, int(graph[b].size())});
  graph[b].push_back({a, 0, -d, int(graph[a].size() - 1)});
}

using ord = tuple<int, int>;
vector<ord> top;

int min_cost_flow(G &graph, int s, int t, int f) {
  const int n = graph.size();
  vector<int> h(n, 0);

  rep(i, n) {
    int v = get<1>(top[i]);
    for (auto &e : graph[v]) {
      if (e.cap > 0)
        chmin(h[e.to], h[v] + e.cost);
    }
  }

  int res = 0;
  while (f) {
    vector<int> dist(n, inf), pv(n, 0), pe(n, 0);

    using state = tuple<int, int>;
    priority_queue<state, vector<state>, greater<state>> q;
    dist[s] = 0, q.push(state(0, s));

    while (!q.empty()) {
      int c, v;
      tie(c, v) = q.top();
      q.pop();
      if (dist[v] < c)
        continue;
      rep(i, graph[v].size()) {
        edge &e = graph[v][i];
        if (e.cap > 0 && chmin(dist[e.to], dist[v] + e.cost + h[v] - h[e.to])) {
          pv[e.to] = v, pe[e.to] = i;
          q.push(state(dist[e.to], e.to));
        }
      }
    }

    if (dist[t] == inf)
      return -1;

    rep(v, n) h[v] += dist[v];

    int d = f;
    for (int v = t; v != s; v = pv[v])
      chmin(d, graph[pv[v]][pe[v]].cap);
    f -= d, res += d * h[t];

    for (int v = t; v != s; v = pv[v]) {
      edge &e = graph[pv[v]][pe[v]];
      e.cap -= d;
      graph[v][e.rev].cap += d;
    }
  }
  return res;
}

int x[3010], t[3010], p[3010];

int main(void) {
  int n, v, xl, xr;
  cin >> n >> v >> xl >> xr;

  const int src = 2 * n, dst = src + 1, l = dst + 1, r = l + 1, all = r + 1;
  G graph(all);

  top.push_back(ord(0, src));
  top.push_back(ord(0, l));
  top.push_back(ord(0, r));
  top.push_back(ord(inf, dst));

  rep(i, n) {
    cin >> x[i] >> t[i] >> p[i];
    top.push_back(ord(t[i], i));
    top.push_back(ord(t[i], n + i));
  }

  sort(_all(top));

  add_edge(graph, src, l, 1, 0);
  add_edge(graph, src, r, 1, 0);
  add_edge(graph, src, dst, 2, 0);

  rep(i, n) {
    if (abs(xl - x[i]) <= v * t[i])
      add_edge(graph, l, i, 1, 0);
    if (abs(xr - x[i]) <= v * t[i])
      add_edge(graph, r, i, 1, 0);

    add_edge(graph, i, i + n, 1, -p[i]);
    add_edge(graph, i, i + n, 1, 0);

    add_edge(graph, i + n, dst, 2, 0);
  }

  rep(i, n) rep(j, n) {
    if (i == j)
      continue;
    if (abs(x[i] - x[j]) <= v * (t[j] - t[i]))
      add_edge(graph, i + n, j, 2, 0);
  }

  cout << -min_cost_flow(graph, src, dst, 2) << endl;
  return 0;
}

Error: 0
2
1


Fixed submission:

#include <bits/stdc++.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using namespace std;

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

using edge = struct {
  int to, cap, cost, rev;
};
using G = vector<vector<edge>>;
const int inf = 1 << 29;

void add_edge(G &graph, int a, int b, int c, int d) {
  graph[a].push_back({b, c, d, int(graph[b].size())});
  graph[b].push_back({a, 0, -d, int(graph[a].size() - 1)});
}

using ord = tuple<int, int>;
vector<ord> top;

int min_cost_flow(G &graph, int s, int t, int f) {
  const int n = graph.size();
  vector<int> h(n, 0);

  rep(i, n) {
    int v = get<1>(top[i]);
    for (auto &e : graph[v]) {
      if (e.cap > 0)
        chmin(h[e.to], h[v] + e.cost);
    }
  }

  int res = 0;
  while (f) {
    cerr << f << endl;
    vector<int> dist(n, inf), pv(n, 0), pe(n, 0);

    using state = tuple<int, int>;
    priority_queue<state, vector<state>, greater<state>> q;
    dist[s] = 0, q.push(state(0, s));

    while (!q.empty()) {
      int c, v;
      tie(c, v) = q.top();
      q.pop();
      if (dist[v] < c)
        continue;
      rep(i, graph[v].size()) {
        edge &e = graph[v][i];
        if (e.cap > 0 && chmin(dist[e.to], dist[v] + e.cost + h[v] - h[e.to])) {
          pv[e.to] = v, pe[e.to] = i;
          q.push(state(dist[e.to], e.to));
        }
      }
    }

    if (dist[t] == inf)
      return -1;

    rep(v, n) h[v] += dist[v];

    int d = f;
    for (int v = t; v != s; v = pv[v])
      chmin(d, graph[pv[v]][pe[v]].cap);
    f -= d, res += d * h[t];

    for (int v = t; v != s; v = pv[v]) {
      edge &e = graph[pv[v]][pe[v]];
      e.cap -= d;
      graph[v][e.rev].cap += d;
    }
  }
  return res;
}

int x[3010], t[3010], p[3010];

int main(void) {
  int n, v, xl, xr;
  cin >> n >> v >> xl >> xr;

  const int src = 2 * n, dst = src + 1, l = dst + 1, r = l + 1, all = r + 1;
  G graph(all);

  top.push_back(ord(0, src));
  top.push_back(ord(0, l));
  top.push_back(ord(0, r));
  top.push_back(ord(inf, dst));

  rep(i, n) {
    cin >> x[i] >> t[i] >> p[i];
    top.push_back(ord(t[i], i));
    top.push_back(ord(t[i], n + i));
  }

  sort(_all(top));

  add_edge(graph, src, l, 1, 0);
  add_edge(graph, src, r, 1, 0);
  add_edge(graph, src, dst, 2, 0);

  rep(i, n) {
    if (abs(xl - x[i]) <= v * t[i])
      add_edge(graph, l, i, 1, 0);
    if (abs(xr - x[i]) <= v * t[i])
      add_edge(graph, r, i, 1, 0);

    add_edge(graph, i, i + n, 1, -p[i]);
    add_edge(graph, i, i + n, 1, 0);

    add_edge(graph, i + n, dst, 2, 0);
  }

  rep(i, n) rep(j, n) {
    if (i == j)
      continue;
    if (abs(x[i] - x[j]) <= v * (t[j] - t[i]))
      add_edge(graph, i + n, j, 2, 0);
  }

  cout << -min_cost_flow(graph, src, dst, 2) << endl;
  return 0;
}