POJ 3171 区间最小花费覆盖 (DP+线段树
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4245 | Accepted: 1429 |
Description
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
Lines 2..N+1: Line i+1 describes cow i's schedule with three space-separated integers: T1, T2, and S.
Output
Sample Input
3 0 4
0 2 3
3 4 2
0 0 1
Sample Output
5
Hint
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+线段树的更多相关文章
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- POJ 2482 Stars in Your Window (线段树+扫描线+区间最值,思路太妙了)
该题和 黑书 P102 采矿 类似 参考链接:http://blog.csdn.net/shiqi_614/article/details/7819232http://blog.csdn.net/ts ...
- HDU 3698 DP+线段树
给出N*M矩阵.每一个点建立灯塔有花费.每一个点的灯塔有连接范围,求每一行都建立一个灯塔的最小花费,要求每相邻两行的灯塔能够互相连接.满足 |j-k|≤f(i,j)+f(i+1,k) DP思路,dp[ ...
- 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 ...
- 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 ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- POJ 3468_A Simple Problem with Integers(线段树)
题意: 给定序列及操作,求区间和. 分析: 线段树,每个节点维护两个数据: 该区间每个元素所加的值 该区间元素和 可以分为"路过"该区间和"完全覆盖"该区间考虑 ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- POJ 2828 Buy Tickets(排队问题,线段树应用)
POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意: 排队买票时候插队. 给出一些数对,分别代表某个人的想要插入的位 ...
随机推荐
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- 织梦上传webp格式图片
织梦cms如何添加其他格式的图片呢? 这里以webp为类来实现一下如何让织梦支持webp 1.修改系统设置让织梦(dede)支持该图片格式,比如:webp(新图片格式) 系统->系统基本参数-& ...
- Window10 Bug记录
1.两台新电脑刚安装: 妹子的电脑JDK配置后,重启后环境变量配置丢失,cmd里能输出,但eclipse启动不了,重新配置后正常. 我的电脑JDK配置,重启后环境变量在,但好像没加载,cmd输出与ec ...
- strdup和strndup函数
首先说明一下:这两个函数不建议使用,原因是返回内存地址把释放权交给别的变量,容易忘记释放. 一.strdup函数 函数原型 头文件:#include <string.h> char *st ...
- Lucene——索引过程分析Index
Lucene索引过程分为3个主要操作步骤:将原始文档转换成文本.分析文本.将分析好的文本保存至索引中 一.提取文本和创建文档 从 pdf.word等非纯文本格式文件中,提取文本格式信息.建立起对应的, ...
- springboot实现邮件发送
1.创建springboot项目. 2.创建好的项目如图: 在static目录下新建index.html. 3.点击启动项目 在浏览器的地址栏中访问:http://localhost:8080/ 访问 ...
- theano中tensor的构造方法
import theano.tensor as T x = T.scalar('myvar') myvar = 256 print type(x),x,myvar 运行结果: <class 't ...
- sql查询语句面试题
几个表 employees 表: EMPLOYEE_ID NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME ...
- CDH4.5.0源代码编译
Unable to load native-hadoop library for your platform解决 安装maven 1 cmake-2.8.12.1.tar.gz cd cmake-2. ...
- centos 6.5 配置nginx环境
1.卸载系统中默认的php和httpd [root@x ~]# yum remove httpd* php* Loaded plugins: fastestmirror Setting up Remo ...