一类经典的线段贪心

Description

公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N。K(1<=K<=50000)群奶牛希望搭乘这辆公交车。第i群牛一共有Mi(1<=Mi<=N)只.

他们希望从Si到Ei去。
公交车只能座C(1<=C<=100)只奶牛。而且不走重复路线,请计算这辆车最多能满足多少奶牛听要求。
注意:对于每一群奶牛,可以部分满足,也可以全部满足,也可以全部不满足。

Input

第1行: 三个整数: K,N,C。 由空格隔开。

第2..K+1行:第i+1行,告诉你第i组奶牛的信息: S_i, E_i and M_i。由空格隔开。

Output

一行:可以在庙会乘坐捷运的牛的最大头数

HINT

捷运可以把2头奶牛从展台1送到展台5,3头奶牛从展台5到展台8, 2头奶牛从展台8 到展台14,1头奶牛从展台9送到展台12,一头奶牛从展台13送到展台14, 一头奶牛从 14送到15。


题目分析

这种“线段贪心”,最经典的莫过于容量为1的情况。

容量为1时,做法就是按照右端点排序,$O(n)$扫一遍选取不冲突的线段。这个贪心之所以不需要“反悔”,是因为价值和容量一一对应:每一时刻不论选哪一条线段,获得价值都是1.从这个角度上来说,所有线段是无差别的。

想法自然但不正确的贪心1

从容量为1的情况会想到:既然答案可以看做是c次互不影响的“容量为1”路径,那就做c次$O(n)$的贪心嘛。

上图中,最优决策的确可以看做是c次互不影响的决策。但是当我们去选取线段时,会发现按照r端点排序的贪心策略在分配c组互不影响的决策上失效了。

依然按照r排序的正确贪心2

这里采用一种非形式化的语言描述这种贪心策略的正确性:

对于总的安排来说,目标是让每一时刻容量都不要空闲;对于细的策略来说,因为这里线段可以拆开,所以目标是让选取的线段越少冲突越好。

那么先按照r排序。排序后,当然是越靠前的线段越“好”。这里的“好”指的是,这条线段既把之前的容量利用起来;又对后面的线段产生较小的影响。

实在不行可以假设这个结论就是对的……

那么我是用永久标记线段树来维护这个贪心过程。

 #include<bits/stdc++.h>
const int maxn = ; struct node
{
int l,r,v;
bool operator < (node a) const
{
return r < a.r;
}
}edges[maxn];
int k,n,c,ans;
int f[maxn<<],add[maxn<<]; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
int query(int rt, int L, int R, int l, int r, int hd)
{
if (L <= l&&r <= R){
return f[rt]+hd;
}
int mid = (l+r)>>, ans = ;
if (L <= mid) ans = std::max(query(rt<<, L, R, l, mid, hd+add[rt]), ans);
if (R > mid) ans = std::max(query(rt<<|, L, R, mid+, r, hd+add[rt]), ans);
return ans;
}
void pushup(int rt)
{
f[rt] = std::max(f[rt<<], f[rt<<|])+add[rt];
}
void adds(int rt, int L, int R, int l, int r, int c)
{
if (L <= l&&r <= R){
f[rt] += c, add[rt] += c;
return;
}
int mid = (l+r)>>;
if (L <= mid) adds(rt<<, L, R, l, mid, c);
if (R > mid) adds(rt<<|, L, R, mid+, r, c);
pushup(rt);
}
int main()
{
k = read(), n = read(), c = read();
for (int i=; i<=k; i++)
edges[i].l = read(), edges[i].r = read(), edges[i].v = read();
std::sort(edges+, edges+k+);
for (int i=; i<=k; i++)
{
int delta = std::min(c-query(, edges[i].l, edges[i].r, , n, ), edges[i].v);
ans += delta;
if (delta)
adds(, edges[i].l, edges[i].r-, , n, delta);
}
printf("%d\n",ans);
return ;
}

END

【贪心】bzoj1577: [Usaco2009 Feb]庙会捷运Fair Shuttle的更多相关文章

  1. bzoj1577 [Usaco2009 Feb]庙会捷运Fair Shuttle

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1577 [题解] 我们把每坨奶牛按s排个序. 对于每坨奶牛,如果车上有空位置就塞. 否则,看下 ...

  2. [bzoj1577][Usaco2009 Feb]庙会捷运Fair Shuttle_贪心_线段树

    庙会捷运 Fair Shuttle bzoj-1577 Usaco-2009 Feb 题目大意:有一辆公交车从1走到n.有m群奶牛从$S_i$到$E_i$,第i群奶牛有$W_i$只.车有一个容量c.问 ...

  3. bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心

    Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...

  4. BZOJ 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle 线段树 + 贪心

    escription 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1&l ...

  5. [Usaco2009 Feb]庙会捷运Fair Shuttle

    Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...

  6. bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】

    按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 #include<iostream> #include<cstdio& ...

  7. 【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    [题意]公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地. [算法]贪心+堆 [题解]线段和点的贪心,一般有按左端点排序和按右端点排序两种方法 ...

  8. <USACO09FEB>庙会捷运Fair Shuttleの思路

    一个没有被我成功证明的 贪心 但是 ac了的 别人排序都是排终点.但我的排终点错了emm排起点才对qvq 有没有人友情看看怎么证(没有 #include<cstdio> #include& ...

  9. 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

随机推荐

  1. MySQL的slave_exec_mode参数作用

    主从复制中常会遇到的问题就是1062主键重复 如果在读写分离的架构中,slave同步失败会对业务造成很大的影响的 因此,很有必要对主从复制做些监控,做些自动化的处理.涉及到MySQL的一个参数slav ...

  2. Codeforces Round #527-B. Teams Forming(贪心)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  3. python之字典的相关操作

    一.什么是字典 dict 用{}表示,用来存放键值对数据 {key:value} 键:具有唯一性,不能重复,不可变 必须是可哈希的(不可变的数据类型) 字典是无序的,没有索引 值: 没有任何限制 已知 ...

  4. Jmeter4.0----cookie(8)

    1.说明 在脚本编写的过程中,我们常常会遇到用户登录的情况,并且将部分重要信息保存在用户的cookie中,所以,来说一下,对用户登录产生cookie的操作情况. 2.步骤 第一步:添加HTTP Coo ...

  5. net core分块上传文件

    net core分块上传文件   写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...

  6. tomcat7 fail to start inside Ubuntu Docker container

    The tomcat startup script needs some special privileges. Concrete it needs to check all running proc ...

  7. 关于报错“More than one fragment with the name [spring_web] was found. This is not legal ...”的解决办法

    最近在搭建一个spring mvc 项目时遇到“More than one fragment with the name [spring_web] was found. This is not leg ...

  8. dubbo工作原理(3)

    dubbo主要核心部件 Remoting:网络通信框架,实现了sync-over-async和request-response消息机制. RPC:一个远程过程调用的抽象,支持负载均衡.容灾和集群功能. ...

  9. pixhawk在linux(ubuntu16.04)下的开发环境搭建和源码编译

      1查找安装文档(http://dev.px4.io/starting-installing-linux.html)(本文仅针对硬件为PIXHAWK的开发环境搭建,其他硬件请参考官方文档)     ...

  10. jquery 一键复制到剪切板

    今天做项目有一个功能,通过点击事件复制一段文本到剪切板,在网上找了一些,整理了一下,方便需要的朋友使用. <a id="copy" data-text="12345 ...