1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <iostream> #include <algorithm> #include <cstdio> #include <queue> #include <vector> using namespace std; const int N = 5010; struct node { int a, b, c; }; int n, m, k, pos[N]; vector<int> to[N]; node p[N]; priority_queue< int, vector<int>, greater<int> > q; void init() { for (int i = 1; i <= n; i++) pos[i] = i; } bool cmp(int a, int b) { return p[a].c > p[b].c; } int main() { scanf("%d%d%d", &n, &m, &k); init(); for (int i = 1; i <= n; i++) scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].c); for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); pos[v] = max(pos[v], u); } for (int i = 1; i <= n; i++) to[pos[i]].push_back(i); for (int i = 1; i <= n; i++) sort(to[i].begin(), to[i].end(), cmp); int res = 0, flag = 1; for (int i = 1; i <= n; i++) { if (p[i].a > k) { int dis = p[i].a - k; if (dis > q.size()) { flag = 0; break; } while (dis--) { int tp = q.top(); q.pop(); res -= tp, k++; } } k += p[i].b; for (int j = 0; j < (int)to[i].size(); j++) { int v = to[i][j]; if (0 == p[v].c) continue; if (0 == k && !q.empty() && p[v].c > q.top()) { int tp = q.top(); q.pop(); res -= tp, k++; } if (k > 0) res += p[v].c, q.push(p[v].c), k--; } } if (0 == flag) printf("-1\n"); else printf("%d\n", res); return 0; }
|