[USACO 09FEB]Fair Shuttle
Description
逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让 奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠N(1 ≤N≤20000)个地点(所有地点都以1到N之间的一个数字来表示)。现在奶牛们分成K(1≤K≤50000)个小组,第i 组有Mi(1 ≤Mi≤N)头奶牛,他们希望从Si跑到Ti(1 ≤Si<Ti≤N)。
由于班车容量有限,可能载不下所有想乘车的奶牛们,此时也允许小里的一部分奶牛分开乘坐班车。约翰经过调查得知班车的容量是C(1≤C≤100),请你帮助约翰计划一个尽可能满足更多奶牛愿望的方案。
Input
第一行:包括三个整数:K,N和C,彼此用空格隔开。
第二行到K+1行:在第i+1行,将会告诉你第i组奶牛的信息:Si,Ei和Mi,彼此用空格隔开。
Output
第一行:可以坐班车的奶牛的最大头数。
Sample Input
8 15 3
1 5 2
13 14 1
5 8 3
8 14 2
14 15 1
9 12 1
12 15 2
4 6 1
Sample Output
10
Hint
班车可以把2头奶牛从1送到5,3头奶牛从5送到8,2头奶牛从8送到14,1头奶牛从9送到12,1头奶牛从13送到14,1头奶牛从14送到15。
题解
注意到可以不全部上车,那么贪心的思路就比较明确了。尽量让下车下得早的多上车,这样利益可以最大化。
我们按区间右端点排序。第$i$个区间$[Li,Ri]$显然我们要找到这个区间范围内已经累加的最大值,最大值可以用线段树维护,这里给出这种版本。
#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
#define Lr (root<<1)
#define Rr (root<<1|1)
using namespace std;
const LL N=; LL k,n,c;
struct tt
{
LL l,r,c;
}a[N+]; LL smg[N*+],maxn[N*+];
LL Query(LL root,LL l,LL r,LL a,LL b);
void Add(LL root,LL l,LL r,LL a,LL b,LL key);
IL void Pushdown(LL root); bool comp(const tt &a,const tt &b){return a.r<b.r;}
IL LL Min(LL a,LL b){return a<b ? a:b;}
IL LL Max(LL a,LL b){return a>b ? a:b;} int main()
{
scanf("%lld%lld%lld",&k,&n,&c);
for (RE LL i=;i<=k;i++)
{
scanf("%lld%lld%lld",&a[i].l,&a[i].r,&a[i].c);
a[i].r--;
}
sort(a+,a+k+,comp);
LL tmp,ans=;
for (RE LL i=;i<=k;i++)
{
tmp=Query(,,n,a[i].l,a[i].r);
if (tmp==c) continue;
ans+=Min(c-tmp,a[i].c);
Add(,,n,a[i].l,a[i].r,Min(c-tmp,a[i].c));
}
printf("%lld\n",ans);
return ;
} LL Query(LL root,LL l,LL r,LL a,LL b)
{
if (a<=l&&r<=b) return maxn[root];
Pushdown(root);
LL mid=(l+r)>>;
LL ans=;
if (mid>=a) ans=Query(Lr,l,mid,a,b);
if (mid<b) ans=Max(ans,Query(Rr,mid+,r,a,b));
return ans;
}
void Add(LL root,LL l,LL r,LL a,LL b,LL key)
{
if (a<=l&&r<=b)
{
smg[root]+=key;
maxn[root]+=key;
return;
}
Pushdown(root);
LL mid=(l+r)>>;
if (mid>=a) Add(Lr,l,mid,a,b,key);
if (mid<b) Add(Rr,mid+,r,a,b,key);
maxn[root]=Max(maxn[Lr],maxn[Rr]);
}
IL void Pushdown(LL root)
{
smg[Lr]+=smg[root];maxn[Lr]+=smg[root];
smg[Rr]+=smg[root];maxn[Rr]+=smg[root];
smg[root]=;
}
[USACO 09FEB]Fair Shuttle的更多相关文章
- [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告
P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...
- BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution
权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...
- [USACO 2009 Feb Gold] Fair Shuttle (贪心+优先队列)
题目大意:有N个站点的轻轨站,有一个容量为C的列车起点在1号站点,终点在N号站点,有K组牛群,每组数量为Mi(1≤Mi≤N),行程起点和终点分别为Si和Ei(1≤Si<Ei≤N).计算最多有多少 ...
- 【贪心】洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle 题解
不是很容易写出正解的贪心问题. 题目描述 Although Farmer John has no problems walking around the fair to collect pri ...
- P1607 [USACO09FEB]庙会班车Fair Shuttle
题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...
- [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx&&贪心
题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...
- 【USACO09FEB】 庙会班车 Fair Shuttle 贪心+线段树
Although Farmer John has no problems walking around the fair to collect prizes or see the shows, his ...
随机推荐
- JavaScript(第十一天)【变量,作用域,内存】
JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据 ...
- Beta冲刺 第四天
Beta冲刺 第四天 1. 昨天的困难 1.网页使用了一些网上现成的模板,其主要是使用像素做处理的,所以检查起来比较费事费力. 2.使用github代码merge时出现了问题.所以花费了不少的时间在人 ...
- SQL函数返回表的示例-Z
create function [dbo].[GetOperateCustGroup] ( ), ) ) returns @TempTable table (MaxPrice float,MinPri ...
- 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
中介者模式 数个对象之间的通信全部委托一个中介者完成.适用于对象之间互相引用,关系错综复杂的情况. 什么情况下需要使用中介者模式 对象较多,且对象间会相互引用,当一个对象的某个状态改变时,得通知其他对 ...
- Python内置函数(15)——memoryview
英文文档: class memoryview(obj) memoryview objects allow Python code to access the internal data of an o ...
- Linux上 ps 命令的用法
ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序. 3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示. 4)ps -e 此 ...
- Spark入门(1-5)Spark统一了TableView和GraphView
下面我们看一下图计算的简单示例: 从图我们可以看出, 拿到Wikipedia的文档后,我们可以: 1.Wikipedia的文档 -- > table视图 -- >分析Hyperlinks超 ...
- C#微信公众号开发——错误一
一.网站发布后,运行报如下错误
- jodatime 时间比较
public ArrayList<CalcPeriod> getCalcPeriods() { DateTime now = DateTime.now(); DateTime.Proper ...
- nexus私服服务器意外关机后,本地不能下载jar包
主要记录一个小问题. 今天要做个需求,需要读取word文档中的表格来在生成数据库建表语句. 读取word文档,要添加maven依赖 <dependency> <groupId> ...