Problem p00825 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rep2(i, a, b) for (ll i = (a); i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define pb emplace_back
#define INF (1e9 + 1)
// #define INF (1LL<<59)

// verified POJ3680
#define MAX_V (365 + 3)
struct edge {
  int to, cap, cost, rev;
};

vector<edge> G[MAX_V];

// fromテ」ツ?凝」ツつ液oテ」ツ?クテ・ツ青妥」ツ?凝」ツ??・ツョツケテゥツ?縦apテ」ツ??」ツつウテ」ツつケテ」ツδ?ostテ」ツ?ョティツセツコテ」ツつ津」ツつッテ」ツつ凖」ツδゥテ」ツδ陛」ツ?ォティツソツステ・ツ環?」ツ?凖」ツつ?
void add_edge(int from, int to, int cap, int cost) {
  G[from].push_back((edge){to, cap, cost, (int)G[to].size()});
  G[to].push_back((edge){from, 0, -cost, (int)G[from].size() - 1});
}

// テ」ツつウテ」ツつケテ」ツδ暗」ツ?古ィツイツ?」ツ?ョティツセツコテ」ツ?古・ツ青ォテ」ツ?セテ」ツつ古」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッテ、ツクツ催ィツヲツ?
void shortest_path(int s, vector<int> &d) {
  int v = d.size();
  rep(i, d.size()) d[i] = INF;
  d[s] = 0;
  rep(loop, v) {
    rep(i, v) {
      for (auto e : G[i]) {
        if (e.cap && d[i] != INF && d[e.to] > d[i] + e.cost)
          d[e.to] = d[i] + e.cost;
      }
    }
  }
}

// sテ」ツ?凝」ツつ液テ」ツ?クテ」ツ?ョテヲツオツ?ゥツ?叔テ」ツ?ョテヲツ慊?・ツーツ湘ィツイツサテァツ板ィテヲツオツ?」ツつ津ヲツアツづ」ツつ?」ツつ?
// テヲツオツ?」ツ?崚」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッ-1テ」ツつ津ィツソツ氾」ツ??
int min_cost_flow(int s, int t, int f) {
  vector<int> h(MAX_V); // テ」ツδ敕」ツδ?」ツδウテ」ツつキテ」ツδ」テ」ツδォ
  vector<int> dist(MAX_V); // テヲツ慊?ァツ淞ュティツキツ敕ゥツ崢「
  int prevv[MAX_V],
      preve
          [MAX_V]; // テァツ崢エテ・ツ可催」ツ?ョテゥツ?づァツつケテ」ツ?ィティツセツコ

  int res = 0;
  shortest_path(s, h);

  while (f > 0) {
    // テ」ツつソテ」ツつ凖」ツつ、テ」ツつッテ」ツつケテ」ツδ暗」ツδゥテヲツウツ陛」ツつ津ァツ板ィテ」ツ??」ツ?ヲhテ」ツつ津ヲツ崢エテヲツ鳴ーテ」ツ?凖」ツつ?
    priority_queue<pii, vector<pii>, greater<pii>> que;
    rep(i, dist.size()) dist[i] = INF;
    dist[s] = 0;
    que.push(pii(0, s));
    while (!que.empty()) {
      pii p = que.top();
      que.pop();
      int v = p.second;
      if (dist[v] < p.first)
        continue;
      for (int i = 0; i < G[v].size(); i++) {
        edge &e = G[v][i];
        if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
          dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
          prevv[e.to] = v;
          preve[e.to] = i;
          que.push(pii(dist[e.to], e.to));
        }
      }
    }
    if (dist[t] == INF)
      return -INF; // テ」ツ?禿」ツつ古、ツサツ・テ、ツクツ甘ヲツオツ?」ツ?崚」ツ?ェテ」ツ??

    for (int v = 0; v < h.size(); v++)
      h[v] += dist[v];

    // s-tテゥツ鳴禿ヲツ慊?ァツ淞ュティツキツッテ」ツ?ォテヲツイツソテ」ツ?」テ」ツ?ヲテァツ崢ョテ、ツクツ?ヲツ敖ッテヲツオツ?」ツ??
    int d = f;
    for (int v = t; v != s; v = prevv[v]) {
      d = min(d, G[prevv[v]][preve[v]].cap);
    }
    f -= d;
    res += d * h[t];
    for (int v = t; v != s; v = prevv[v]) {
      edge &e = G[prevv[v]][preve[v]];
      e.cap -= d;
      G[v][e.rev].cap += d;
    }
  }
  return res;
}

int main() {
  int n;
  while (cin >> n && n) {
    rep(i, MAX_V) G[i].clear();

    map<pii, vector<int>> mp;
    set<int> st;
    rep(i, n) {
      int s, t, c;
      cin >> s >> t >> c;
      s--, t;
      st.insert(s);
      st.insert(t);
      mp[pii(s, t)].pb(c);
    }
    for (auto e : mp) {
      sort(all(e.second), greater<int>());
      rep(i, min(2, (int)e.second.size()))
          add_edge(e.first.first, e.first.second, 1, -e.second[i]);
    }
    int S = 366;
    int T = S + 1;

    int bef = -1;
    for (auto it = st.begin(); it != st.end(); it++) {
      if (it == st.begin()) {
        bef = *it;
      } else {
        add_edge(bef, *it, INF, 0);
        bef = *it;
      }
    }
    auto it = st.begin();
    add_edge(S, *it, INF, 0);

    it = st.end();
    add_edge(*(--it), T, INF, 0);

    cout << -1 * min_cost_flow(S, T, 2) << endl;
  }
}

Error: MLE

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rep2(i, a, b) for (ll i = (a); i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define pb emplace_back
#define INF (1e9 + 1)
// #define INF (1LL<<59)

// verified POJ3680
#define MAX_V (365 + 2)
struct edge {
  int to, cap, cost, rev;
};

vector<edge> G[MAX_V];

// fromテ」ツ?凝」ツつ液oテ」ツ?クテ・ツ青妥」ツ?凝」ツ??・ツョツケテゥツ?縦apテ」ツ??」ツつウテ」ツつケテ」ツδ?ostテ」ツ?ョティツセツコテ」ツつ津」ツつッテ」ツつ凖」ツδゥテ」ツδ陛」ツ?ォティツソツステ・ツ環?」ツ?凖」ツつ?
void add_edge(int from, int to, int cap, int cost) {
  G[from].push_back((edge){to, cap, cost, (int)G[to].size()});
  G[to].push_back((edge){from, 0, -cost, (int)G[from].size() - 1});
}

// テ」ツつウテ」ツつケテ」ツδ暗」ツ?古ィツイツ?」ツ?ョティツセツコテ」ツ?古・ツ青ォテ」ツ?セテ」ツつ古」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッテ、ツクツ催ィツヲツ?
void shortest_path(int s, vector<int> &d) {
  int v = d.size();
  rep(i, d.size()) d[i] = INF;
  d[s] = 0;
  rep(loop, v) {
    rep(i, v) {
      for (auto e : G[i]) {
        if (e.cap && d[i] != INF && d[e.to] > d[i] + e.cost)
          d[e.to] = d[i] + e.cost;
      }
    }
  }
}

// sテ」ツ?凝」ツつ液テ」ツ?クテ」ツ?ョテヲツオツ?ゥツ?叔テ」ツ?ョテヲツ慊?・ツーツ湘ィツイツサテァツ板ィテヲツオツ?」ツつ津ヲツアツづ」ツつ?」ツつ?
// テヲツオツ?」ツ?崚」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッ-1テ」ツつ津ィツソツ氾」ツ??
int min_cost_flow(int s, int t, int f) {
  vector<int> h(MAX_V); // テ」ツδ敕」ツδ?」ツδウテ」ツつキテ」ツδ」テ」ツδォ
  vector<int> dist(MAX_V); // テヲツ慊?ァツ淞ュティツキツ敕ゥツ崢「
  int prevv[MAX_V],
      preve
          [MAX_V]; // テァツ崢エテ・ツ可催」ツ?ョテゥツ?づァツつケテ」ツ?ィティツセツコ

  int res = 0;
  shortest_path(s, h);

  while (f > 0) {
    // テ」ツつソテ」ツつ凖」ツつ、テ」ツつッテ」ツつケテ」ツδ暗」ツδゥテヲツウツ陛」ツつ津ァツ板ィテ」ツ??」ツ?ヲhテ」ツつ津ヲツ崢エテヲツ鳴ーテ」ツ?凖」ツつ?
    priority_queue<pii, vector<pii>, greater<pii>> que;
    rep(i, dist.size()) dist[i] = INF;
    dist[s] = 0;
    que.push(pii(0, s));
    while (!que.empty()) {
      pii p = que.top();
      que.pop();
      int v = p.second;
      if (dist[v] < p.first)
        continue;
      for (int i = 0; i < G[v].size(); i++) {
        edge &e = G[v][i];
        if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
          dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
          prevv[e.to] = v;
          preve[e.to] = i;
          que.push(pii(dist[e.to], e.to));
        }
      }
    }
    if (dist[t] == INF)
      return -INF; // テ」ツ?禿」ツつ古、ツサツ・テ、ツクツ甘ヲツオツ?」ツ?崚」ツ?ェテ」ツ??

    for (int v = 0; v < h.size(); v++)
      h[v] += dist[v];

    // s-tテゥツ鳴禿ヲツ慊?ァツ淞ュティツキツッテ」ツ?ォテヲツイツソテ」ツ?」テ」ツ?ヲテァツ崢ョテ、ツクツ?ヲツ敖ッテヲツオツ?」ツ??
    int d = f;
    for (int v = t; v != s; v = prevv[v]) {
      d = min(d, G[prevv[v]][preve[v]].cap);
    }
    f -= d;
    res += d * h[t];
    for (int v = t; v != s; v = prevv[v]) {
      edge &e = G[prevv[v]][preve[v]];
      e.cap -= d;
      G[v][e.rev].cap += d;
    }
  }
  return res;
}

int main() {
  int n;
  while (cin >> n && n) {
    rep(i, MAX_V) G[i].clear();
    rep(i, n) {
      int s, t, c;
      cin >> s >> t >> c;
      s--, t;
      add_edge(s, t, 1, -c);
    }
    int S = 365;
    int T = S + 1;
    add_edge(S, 0, INF, 0);
    add_edge(364, T, INF, 0);
    rep(i, 365 - 1) add_edge(i, i + 1, INF, 0);

    cout << -1 * min_cost_flow(S, T, 2) << endl;
  }
}