洛谷P4644 [USACO2005 Dec]Cleaning Shifts 清理牛棚 [DP,数据结构优化]
清理牛棚
题目描述
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.
约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群有洁癖的奶牛满意,他不得不雇佣她们中的一些来清扫牛棚, 约翰的奶牛中有N(1≤N≤10000)头愿意通过清扫牛棚来挣一些零花钱.由于在某个时段中奶牛们会在牛棚里随时随地地乱扔垃圾,自然地,她们要求在这段时间里,无论什么时候至少要有一头奶牛正在打扫.需要打扫的时段从某一天的第M秒开始,到第E秒结束f0≤M≤E≤86399).注意这里的秒是指时间段而不是时间点,也就是说,每天需要打扫的总时间是E-M+I秒. 约翰已经从每头牛那里得到了她们愿意接受的工作计划:对于某一头牛,她每天都愿意在笫Ti,.T2秒的时间段内工作(M≤Ti≤马≤E),所要求的报酬是S美元(0≤S≤500000).与需打扫时段的描述一样,如果一头奶牛愿意工作的时段是每天的第10_20秒,那她总共工作的时间是11秒,而不是10秒.约翰一旦决定雇佣某一头奶牛,就必须付给她全额的工资,而不能只让她工作一段时间,然后再按这段时间在她愿意工作的总时间中所占的百分比来决定她的工资.现在请你帮约翰决定该雇佣哪些奶牛以保持牛棚的清洁,当然,在能让奶牛们满意的前提下,约翰希望使总花费尽量小.
输入输出格式
输入格式:
- 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.
第1行:3个正整数N,M,E,用空格隔开.
第2到N+1行:第i+l行给出了编号为i的奶牛的工作计划,即3个用空格隔开的正整数Ti,T2,S.
输出格式:
- 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.
输出一个整数,表示约翰需要为牛棚清理工作支付的最少费用.如果清理工作不可能完成,那么输出-1.
输入输出样例
3 0 4
0 2 3
3 4 2
0 0 1
5
说明
约翰有3头牛,牛棚在第0秒到第4秒之间需要打扫.第1头牛想要在第0,1,2秒内工作,为此她要求的报酬是3美元.其余的依此类推. 约翰雇佣前两头牛清扫牛棚,可以只花5美元就完成一整天的清扫.
分析:
数据结构优化$DP$的模板。
不难想到暴力的转移方程,令$L,R$为总的区间,$l,r$为每一头牛清理的区间。先把每个区间按照右端点从小到大排序,然后转移方程就是$dp[r]=min(dp[r],min\{dp[l-1],dp[l],...dp[r]\}+s[i])$。但是直接暴力转移的话复杂度是$O(n^2)$的,不过我们明显可以发现,中间对$dp[l-1]$到$dp[r]$取$min$的过程是$RMQ$,所以可以套个线段树求解,这样就可以$A$了,不过数据比较卡,注意边界问题。
Code:
//It is made by HolseLee on 24th Sep 2018
//Luogu.org P4644
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N=1e5+;
int n,L,R;
int seg[N<<],dp[N];
struct Node {
int l,r,s;
}a[N]; inline int read()
{
char ch=getchar(); int num=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar();
}
while( ch>='' && ch<='' ) {
num=num*+ch-''; ch=getchar();
}
return flag ? -num : num;
} inline void pushup(int rt)
{
seg[rt]=min(seg[rt<<],seg[rt<<|]);
} void build(int l,int r,int rt)
{
if( l>r ) return;
if( l==r ) {
seg[rt]=dp[l]; return;
}
int mid=(l+r)>>;
build(l,mid,rt<<); build(mid+,r,rt<<|);
pushup(rt);
} int quary(int l,int r,int rt,int LL,int RR)
{
int ret=<<;
if( r<LL || l>RR ) return ret;
if( LL<=l && r<=RR ) return seg[rt];
int mid=(l+r)>>;
if( LL<=mid ) ret=min(ret,quary(l,mid,rt<<,LL,RR));
if( RR>mid ) ret=min(ret,quary(mid+,r,rt<<|,LL,RR));
return ret;
} void update(int l,int r,int rt,int pos,int x)
{
if( l>pos || r<pos ) return;
if( l==r && l==pos ) {
seg[rt]=x; return;
}
int mid=(l+r)>>;
if( pos<=mid ) update(l,mid,rt<<,pos,x);
else update(mid+,r,rt<<|,pos,x);
pushup(rt);
} inline bool cmp(Node x,Node y)
{
return x.r<y.r;
} int main()
{
n=read(); L=read(); R=read();
for(int i=; i<=n; ++i) {
a[i].l=read(), a[i].r=read(), a[i].s=read();
}
sort(a+,a+n+,cmp);
memset(dp,0x3f,sizeof(dp));
dp[L]=;
build(L,R,);
for(int i=; i<=n; ++i) {
dp[a[i].r]=min(dp[a[i].r],quary(L,R,,a[i].l-,a[i].r)+a[i].s);
update(L,R,,a[i].r,dp[a[i].r]);
if( a[i].r>=R ) {
if( dp[a[i].r]==0x3f3f3f3f ) printf("-1");
else printf("%d\n",dp[a[i].r]);
break;
}
}
return ;
}
洛谷P4644 [USACO2005 Dec]Cleaning Shifts 清理牛棚 [DP,数据结构优化]的更多相关文章
- P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚
P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚 你有一段区间需要被覆盖(长度 <= 86,399) 现有 \(n \leq 10000\) 段小线段, 每段可 ...
- [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)
[Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...
- 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚 dp/线段树
题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...
- [BZOJ1672][Usaco2005 Dec]Cleaning Shifts 清理牛棚 线段树优化DP
链接 题意:给你一些区间,每个区间都有一个花费,求覆盖区间 \([S,T]\) 的最小花费 题解 先将区间排序 设 \(f[i]\) 表示决策到第 \(i\) 个区间,覆盖满 \(S\dots R[i ...
- BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 414 Solved: ...
- BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MB Description Farm ...
- BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树
BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意: 约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
[BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...
- 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚
题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...
随机推荐
- jq的图片放大镜效果
<div class="imgbox"> <div class="probox"> <img src="" a ...
- js闭包及问题的解决
闭包定义,作用 闭包就是能够读取其他函数内部变量的函数. 作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中 缺点:闭包会保存函数中的变量在内存中,导致内存消耗大 闭包会 ...
- AngularJs编辑器
问题:在使用过程中遇到的问题就是:angularJS绑定不上值.后来找到一种可以用的方式. html页 <div class="all"> <script typ ...
- 最小割dp Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E
http://codeforces.com/contest/724/problem/E 题目大意:有n个城市,每个城市有pi件商品,最多能出售si件商品,对于任意一队城市i,j,其中i<j,可以 ...
- Linux高级编程--01.vi命令
VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠 ...
- MongoDB - MongoDB CRUD Operations, Query Documents, Query for Null or Missing Fields
Different query operators in MongoDB treat null values differently. The examples on this page use th ...
- 【BZOJ】1143: [CTSC2008]祭祀river
[题意]求DAG上最多的点使得互不可达. [算法]floyd+最大匹配 [题解] 链是DAG上的一个点集,集合内的点相互单向可达. 反链是DAG上的一个点集,集合内的点相互不可达. 题目显然是求最长反 ...
- 29、filter、map、reduce的作用?
通俗的说..都是用在一堆数据(比如一个列表)上.. map是用同样方法把所有数据都改成别的..字面意思是映射..比如把列表的每个数都换成其平方.. reduce是用某种方法依次把所有数据丢进去最后得到 ...
- http 之cookie和session
cookie和session 关于http: 1.http是:无状态.短连接 2.http的请求生命周期:给服务端发送一个请起头,通过域名提取url,通过路由关系匹配,再通过函数+html进行模板加 ...
- Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法
在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: 代码如下: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的sour ...