Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2813 | Accepted: 976 |
Description
Input
Output
Sample Input
3 0 4 0 2 3 3 4 2 0 0 1
Sample Output
5
Hint
Source
#include <map> #include <set> #include <list> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010; const long long inf = 0x7fffffff; struct node { int l, r; long long val; }tree[N << 2], seg[N]; long long dp[N]; int cmp(node a, node b) { return a.r < b.r; } void build(int p, int l, int r) { tree[p].l = l; tree[p].r = r; tree[p].val = inf; if (l == r) { return; } int mid = (l + r) >> 1; build(p << 1, l, mid); build(p << 1 | 1, mid + 1, r); } void update(int p, int pos, long long val) { if (tree[p].l == tree[p].r) { tree[p].val = min(tree[p].val, val); return; } int mid = (tree[p].l + tree[p].r) >> 1; if (pos <= mid) { update(p << 1, pos, val); } else { update(p << 1 | 1, pos, val); } tree[p].val = min(tree[p << 1].val, tree[p << 1 | 1].val); } long long query(int p, int l, int r) { if (l <= tree[p].l && tree[p].r <= r) { return tree[p].val; } int mid = (tree[p].l + tree[p].r) >> 1; if (r <= mid) { return query(p << 1, l, r); } else if (l > mid) { return query(p << 1 | 1, l, r); } else { return min(query(p << 1, l, mid), query(p << 1 | 1, mid + 1, r)); } } int main() { int l, r, n; while (~scanf("%d%d%d", &n, &l, &r)) { for (int i = 0; i < n; ++i) { scanf("%d%d%lld", &seg[i].l, &seg[i].r, &seg[i].val); } sort (seg, seg + n, cmp); build(1, 1, r + 1); for (int i = 0; i <= 90000; ++i) { dp[i] = inf; } for (int i = 0; i < n; ++i) { if (seg[i].r < l) { continue; } if (seg[i].l <= l) { dp[seg[i].r] = min(dp[seg[i].r], seg[i].val); } else { dp[seg[i].r] = min(dp[seg[i].r], query(1, seg[i].l, seg[i].r) + seg[i].val); } update(1, seg[i].r + 1, dp[seg[i].r]); } long long ans = inf; for (int i = r; i <= seg[n - 1].r; ++i) { ans = min(ans, dp[i]); } if (ans >= inf) { printf("-1\n"); } else { printf("%lld\n", ans); } } return 0; }