【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
【题意】公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地。
【算法】贪心+堆
【题解】线段和点的贪心,一般有按左端点排序和按右端点排序两种方法。
按左端点排序,到达了终点就下车,人数满了就贪心地删掉当前终点最远的牛。
正确性在于,在对左一致的情况下,优先删除对右影响最大的牛。
本来以为很难实现,但是想清楚之后写起来十分顺畅,还是要有信心><
对于到达终点下车,按终点维护小根堆。
对于满人数贪心删终点最大的,维护大根堆。
用标号vis和剩余牛数num连接两个堆的删除。
复杂度O(k log k)。
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
struct cycmax{
int id,ed;
bool operator < (const cycmax &a)const{
return ed<a.ed;
}
};
priority_queue<cycmax>cmax;
struct cycmin{
int id,ed;
bool operator < (const cycmin &a)const{
return ed>a.ed;
}
};
priority_queue<cycmin>cmin;
struct cyc{
int l,r,num;
}a[maxn];
bool cmp(cyc a,cyc b){return a.l<b.l;}
int k,n,c,ans=,number=;
bool vis[maxn];
int main(){
scanf("%d%d%d",&n,&k,&c);
for(int i=;i<=n;i++){
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].num);
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
cmax.push((cycmax){i,a[i].r});
cmin.push((cycmin){i,a[i].r});
number+=a[i].num;
if(a[i].l!=a[i+].l){
while(!cmin.empty()&&cmin.top().ed<=a[i].l){
cycmin x=cmin.top();
if(!vis[x.id]){
ans+=a[x.id].num;
number-=a[x.id].num;
vis[x.id]=;
}
cmin.pop();
}
while(number>c){
cycmax x=cmax.top();
if(!vis[x.id]){
if(number-a[x.id].num>=c){
number-=a[x.id].num;
vis[x.id]=;
cmax.pop();
}
else{
a[x.id].num-=number-c;//zhu yi shun xu le!!!
number=c;
}
}else cmax.pop();
}
}
}
while(!cmax.empty()){
cycmax x=cmax.top();cmax.pop();
if(!vis[x.id])ans+=a[x.id].num;
}
printf("%d",ans);
return ;
}
另一种做法,按右端点排序,能塞就塞,不能塞就不要,用线段树维护。(感性的理解一下,替换之前的效果一样却反而会占用到后面的,既然前面能解决的事为什么要交给后面的)
【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle的更多相关文章
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心
Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...
- BZOJ 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle 线段树 + 贪心
escription 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1&l ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】
按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 #include<iostream> #include<cstdio& ...
- 【贪心】bzoj1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
一类经典的线段贪心 Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i ...
- [Usaco2009 Feb]庙会捷运Fair Shuttle
Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...
- bzoj1577 [Usaco2009 Feb]庙会捷运Fair Shuttle
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1577 [题解] 我们把每坨奶牛按s排个序. 对于每坨奶牛,如果车上有空位置就塞. 否则,看下 ...
- [bzoj1577][Usaco2009 Feb]庙会捷运Fair Shuttle_贪心_线段树
庙会捷运 Fair Shuttle bzoj-1577 Usaco-2009 Feb 题目大意:有一辆公交车从1走到n.有m群奶牛从$S_i$到$E_i$,第i群奶牛有$W_i$只.车有一个容量c.问 ...
- <USACO09FEB>庙会捷运Fair Shuttleの思路
一个没有被我成功证明的 贪心 但是 ac了的 别人排序都是排终点.但我的排终点错了emm排起点才对qvq 有没有人友情看看怎么证(没有 #include<cstdio> #include& ...
- Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
随机推荐
- Java微笔记(4)
Java 中的内部类 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类 内部类的主要作用如下: 内部类提供了更好的封装,可以把内部类隐藏在外部类之 ...
- Khan Academy
Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.
- 《剑指offer》---寻找反转数组最小值
本文算法使用python3实现 1.题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...
- OSG学习:矩阵变换节点示例
#include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...
- BAT批处理(五)
批处理程序 一.交互界面设计 没啥说的,看看设计的菜单界面吧:@echo offclstitle 终极多功能修复:menuclscolor 0Aecho.echo ================== ...
- 第20天:京东nav、footer部分制作
一.鼠标的4种状态 cursor:pointer; 鼠标变成小手cursor:default;小白cursor:move;移动cursor:text;文本输入 二.网页布局:1.input.butto ...
- [洛谷P5068][Ynoi2015]我回来了
题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...
- [洛谷P4092][HEOI2016/TJOI2016]树
题目大意:给你一棵树,有两个操作: $C\;x:$给第$x$个节点打上标记 $Q\;x:$询问第$x$个节点的祖先中最近的打过标记的点(自己也是自己的祖先) 题解:树剖,可以维护区间或,然后若一段区间 ...
- ES6 Set,WeakSet,Map,WeakMap
1. Set Set是一个集合,里面的值都是唯一的,没有重复的.Set中可以是任何数据类型,并且添加数据时会进行严格比较,重复数据无法加入. 2. WeakSet 弱引用Set.只能存储对象,不能存储 ...
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...