Cleaning Shifts
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4245   Accepted: 1429

Description

Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now require their barn to be immaculate. Farmer John, the most obliging of farmers, has no choice but hire some of the cows to clean the barn.

Farmer John has N (1 <= N <= 10,000) cows who are willing to do some cleaning. Because dust falls continuously, the cows require that the farm be continuously cleaned during the workday, which runs from second number M to second number E during the day (0 <= M <= E <= 86,399). Note that the total number of seconds during which cleaning is to take place is E-M+1. During any given second M..E, at least one cow must be cleaning.

Each cow has submitted a job application indicating her willingness to work during a certain interval T1..T2 (where M <= T1 <= T2 <= E) for a certain salary of S (where 0 <= S <= 500,000). Note that a cow who indicated the interval 10..20 would work for 11 seconds, not 10. Farmer John must either accept or reject each individual application; he may NOT ask a cow to work only a fraction of the time it indicated and receive a corresponding fraction of the salary.

Find a schedule in which every second of the workday is covered by at least one cow and which minimizes the total salary that goes to the cows.

Input

Line 1: Three space-separated integers: N, M, and E.

Lines 2..N+1: Line i+1 describes cow i's schedule with three space-separated integers: T1, T2, and S.

Output

Line 1: a single integer that is either the minimum total salary to get the barn cleaned or else -1 if it is impossible to clean the barn.

Sample Input

3 0 4
0 2 3
3 4 2
0 0 1

Sample Output

5

Hint

Explanation of the sample:

FJ has three cows, and the barn needs to be cleaned from second 0 to second 4. The first cow is willing to work during seconds 0, 1, and 2 for a total salary of 3, etc.

Farmer John can hire the first two cows.

Source

 

题意:给n个区间及其代价值,问要覆盖[M,E]区间至少要花费多少代价;

解法:这是一个dp问题,先列出方程。

F[i]表示取[0,i]这个区间的代价,初始化F[M-1]=0,答案就是F[E].

则方程为F[a[i].T2]=min(F[a[j].T2])+a[i].s (T1-1<=a[j].T2<T2),找min的过程用线段树实现。

将a[i]按T2从小到大排列,逐步更新最小值。

代码:

 #include"bits/stdc++.h"

 #define ll long long
#define vl vector<ll>
#define ci(x) scanf("%d",&x)
#define pi(x) printf("%d\n",x)
#define pl(x) printf("%lld\n",x)
#define rep(i, n) for(int i=0;i<n;i++)
using namespace std;
const int NN = 1e6 + ;
int n,s,t;
struct P{int x,y,s;};
P a[NN];
bool cmp(P a,P b){
return a.y<b.y;
}
const ll INF = 0x3fffffffffffffff;
struct SegMin {
int N;
vl is;vl mul;vl add;
ll init;
ll merge(ll a, ll b) {
return min(a, b);
}
void push(int o, int L, int R, ll m, ll a) {
is[o] = is[o] * m + a;
mul[o] = mul[o] * m;
add[o] = add[o] * m + a;
} SegMin(int n, ll init=INF) {
N = ;
while (N < n) N *= ;
this->init = init;
is = vl(N * , init);
mul = vl(N * , );
add = vl(N * );
} SegMin(vl a, ll init=INF) {
int n = a.size();
N = ;
while (N < n) N *= ;
this->init = init;
is = vl(N * );
mul = vl(N * , );
add = vl(N * );
copy(a.begin(), a.end(), is.begin() + N);
for (int i = N - ; i > ; i--) {
is[i] = merge(is[i << ], is[i << | ]);
}
} void update(int l, int r, ll m, ll a) {
if (l < r) update(, , N, l, r, m, a);
} void update(int o, int L, int R, int l, int r, ll m, ll a) {
if (l <= L && R <= r) {
push(o, L, R, m, a);
} else {
int M = (L + R) >> ;
push(o, L, M, R);
if (l < M) update(o << , L, M, l, r, m, a);
if (r > M) update(o << | , M, R, l, r, m, a);
is[o] = merge(is[o << ], is[o << | ]);
}
} void push(int o, int L, int M, int R) {
if (mul[o] != || add[o] != ) {
push(o << , L, M, mul[o], add[o]);
push(o << | , M, R, mul[o], add[o]);
mul[o] = ;
add[o] = ;
}
} ll query(int l, int r) {
if (l < r) return query(, , N, l, r);
return init;
} ll query(int o, int L, int R, int l, int r) {
if (l <= L && R <= r) {
return is[o];
} else {
int M = (L + R) >> ;
push(o, L, M, R);
ll res = init;
if (l < M) res = merge(res, query(o << , L, M, l, r));
if (r > M) res = merge(res, query(o << | , M, R, l, r));
is[o] = merge(is[o << ], is[o << | ]);
return res;
}
}
}; int main(){
ci(n),ci(s),ci(t);//s从1开始
s++,t++;
int ma=;
for(int i=;i<n;i++) ci(a[i].x),ci(a[i].y),ci(a[i].s);
for(int i=;i<n;i++) a[i].x++,a[i].y++,ma=max(ma,a[i].y);
sort(a,a+n,cmp);
SegMin seg(ma+);
seg.update(,ma+,,INF);
seg.update(,s,,); for(int i=;i<n;i++){
if(a[i].y<s) continue;
int L=a[i].x-,R=a[i].y;
ll res=seg.query(L,R)+a[i].s;
res=min(seg.query(R,R+),res);//与前面的最小值取min
seg.update(R,R+,,res);
}
ll ans=seg.query(t,ma+);
if(ans>=INF) puts("-1");//未覆盖到
else pl(ans);
return ;
}

POJ 3171 区间最小花费覆盖 (DP+线段树的更多相关文章

  1. cf834D(dp+线段树区间最值,区间更新)

    题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...

  2. POJ 2482 Stars in Your Window (线段树+扫描线+区间最值,思路太妙了)

    该题和 黑书 P102 采矿 类似 参考链接:http://blog.csdn.net/shiqi_614/article/details/7819232http://blog.csdn.net/ts ...

  3. HDU 3698 DP+线段树

    给出N*M矩阵.每一个点建立灯塔有花费.每一个点的灯塔有连接范围,求每一行都建立一个灯塔的最小花费,要求每相邻两行的灯塔能够互相连接.满足 |j-k|≤f(i,j)+f(i+1,k) DP思路,dp[ ...

  4. bzoj 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚【dp+线段树】

    设f[i]为i时刻最小花费 把牛按l升序排列,每头牛能用f[l[i]-1]+c[i]更新(l[i],r[i])的区间min,所以用线段树维护f,用排完序的每头牛来更新,最后查询E点即可 #includ ...

  5. poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解

    A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...

  6. ZOJ 3349 Special Subsequence 简单DP + 线段树

    同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...

  7. POJ 3468_A Simple Problem with Integers(线段树)

    题意: 给定序列及操作,求区间和. 分析: 线段树,每个节点维护两个数据: 该区间每个元素所加的值 该区间元素和 可以分为"路过"该区间和"完全覆盖"该区间考虑 ...

  8. Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)

    Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...

  9. POJ 2828 Buy Tickets(排队问题,线段树应用)

    POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队.  给出一些数对,分别代表某个人的想要插入的位 ...

随机推荐

  1. 对数组排序进行"洗牌"(随机排序)

    这段代码在这里使用Fisher Yates洗牌算法给一个指定的数组进行洗牌(随机排序). function shuffle(arr) {     var i,        j,        tem ...

  2. The fifth day

    All men cannot be first . 今日单词: first(形容词):第一的:基本的:最早的:(副词):第一:首先 翻译:不可能人人都是第一名. <Only Love>-- ...

  3. 用canvas绘制一个简易时钟

    在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数 ...

  4. 解决Pandoc wasn't found.pdflatex not found on PATH

    解决nbconvert failed: Pandoc wasn't found.解决nbconvert failed: pdflatex not found on PATH 问题1描述 500 : I ...

  5. CloudWAN

    类型: 定制服务 软件包: collaboration Enterprise integration integrated industry internet IT service/informati ...

  6. 详细讲解:通过composer安装TP5.1(Thinkphp5.1)

    现在TP5越来越火了,TP5也更新到了5.1版本,但是5.1以上版本只能通过composer来进行安装,那么这里贴出详细的步骤 前提:PHP版本必须要5.6以上 参考网址:http://www.thi ...

  7. 显示C++数据的数据类型

    #include <typeinfo> using namespace std; ... cout << typeid(d).name() << endl; 其中, ...

  8. webpack了解

    一.理解webpack 什么是webpack? 是一个模块打包器.它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform).打包 ...

  9. 814. Binary Tree Pruning(leetcode) (tree traverse)

    https://leetcode.com/contest/weekly-contest-79/problems/binary-tree-pruning/ -- 814 from leetcode tr ...

  10. vsftpd 启动 vsftpd:500 OOPS: bad bool value in config file for: guest_enable

    不然启动时会涌现毛病,举个例子 guest_enable=YES  后面出现空格,就会出现 为 vsftpd 启动 vsftpd:500 OOPS: bad bool value in config ...