#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXS = 10000 + 10;
const int MAXN = 100000 + 10;
int n,m,e,f[MAXN];
struct shifts {
int a,b,c;
}sh[MAXS];
bool cmp(shifts a, shifts b) {
return a.b < b.b;
}
struct SegmentTree{
int k,l,r;
}t[MAXN * 4];
void build(int p, int l, int r) {
if(l == r) {
t[p].l = t[p].r = l;
t[p].k = f[l];
return;
}
t[p].l = l;
t[p].r = r;
int mid = l+r>>1;
build(p*2, l, mid);
build(p*2+1, mid+1, r);
t[p].k = min(t[p*2].k, t[p*2+1].k);
}
int que(int p, int l, int r) {
if(l <= t[p].l && t[p].r <= r) {
return t[p].k;
}
int mid = t[p].l + t[p].r >> 1;
int k = 1<<30;
if(l <= mid) {
k = min(k, que(p*2, l, r));
}
if(r > mid) {
k = min(k, que(p*2+1, l, r));
}
return k;
}
void change(int p, int loc, int num) {
if(t[p].l == t[p].r) {
t[p].k = num;
return;
}
int mid = t[p].l+t[p].r>>1;
if(loc <= mid) {
change(p*2, loc, num);
} else {
change(p*2+1, loc, num);
}
t[p].k = min(t[p*2].k, t[p*2+1].k);
}
int main() {
cin >> n >> m >> e;
m++, e++;
for(int i=1; i<=n; i++) {
scanf("%d %d %d", &sh[i].a, &sh[i].b, &sh[i].c);
sh[i].a++, sh[i].b++;
}
sort(sh+1, sh+n+1, cmp);
memset(f,0x3f,sizeof(f));
int st = f[2];
f[m-1] = 0;
build(1,m-1,max(e,sh[n].b));
for(int i=1; i<=n; i++) {
int a = sh[i].a;
int b = sh[i].b;
int c = sh[i].c;
f[b] = min(f[b], que(1, a-1, b-1) + c);
change(1, b, f[b]);
}
int ans = st;
for(int i=e; i<=sh[n].b; i++) {
ans = min(ans, f[i]);
}
if(ans == st) {
printf("-1\n");
return 0;
}
printf("%d\n", ans);
return 0;
}
POJ3171 Cleaning shifts - DP - 数据结构优化
最新推荐文章于 2021-11-02 23:34:55 发布