【洛谷1607】【USACO09FEB】庙会班车
题面
题目描述
逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠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),请你帮助约翰计划一个尽可能满足更多奶牛愿望的方案。
输入格式:
【输入】
第一行:包括三个整数:K,N和C,彼此用空格隔开。
第二行到K+1行:在第i+1行,将会告诉你第i组奶牛的信息:Si,Ei和Mi,彼
此用空格隔开。
输出格式:
【输出】
第一行:可以坐班车的奶牛的最大头数。
输入输出样例
输入样例#1:
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
输出样例#1:
10
题解
这道题很明显的一道贪心题目。
首先对每一组奶牛进行排序
类似于线段覆盖之类的题目
很显然
终点越靠前的组的优先级越高
因此,排完序之后,直接贪心求解即可。
但是,,,,洛谷的数据略水。。。。
对于任意一组,当前能够放多少就放多少
而能够放的最大数量,就是它所在的区间的最小值。
而要时时维护区间最小值显然要使用O(logn)的数据结构(看一看题目数据范围)
但是。。。在洛谷上面直接使用O(n)的暴力既可以AC
数据真的水。。。
但是我还是把线段树的AC代码放在底下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 1000100
struct tree
{
int l,r;
int num;
int lazy;
}T[MAX*4];
struct Group
{
int a,b;//从a到b
int num;//数量
}G[MAX];
bool operator <(Group a,Group b)
{
if(a.b!=b.b)
return a.b<b.b;
else
return a.a<b.a;
}
int C,N,K;
void Build(int k,int l,int r)
{
T[k]=(tree){l,r,0,0};
if(l==r)
{
T[k].num=C;
return;
}
int mid=(l+r)>>1;
Build(k*2,l,mid);
Build(k*2+1,mid+1,r);
T[k].num=min(T[k*2].num,T[k*2+1].num);
}
void Down(int k)
{
if(T[k].l==T[k].r)
{
T[k].num+=T[k].lazy;
T[k].lazy=0;
return;
}
T[k].num+=T[k].lazy;
T[k*2].lazy+=T[k].lazy;
T[k*2+1].lazy+=T[k].lazy;
T[k].lazy=0;
}
void Update(int k,int L,int R,int w)
{
Down(k);
if(T[k].l==L&&T[k].r==R)
{
T[k].lazy+=w;
Down(k);
return;
}
int mid=(T[k].l+T[k].r)>>1;
if(L<=mid&&R>mid)
{
Update(k*2,L,mid,w);
Update(k*2+1,mid+1,R,w);
}
else
if(L>mid)
Update(k*2+1,L,R,w);
else
if(R<=mid)
Update(k*2,L,R,w);
Down(k*2);
Down(k*2+1);
T[k].num=min(T[k*2].num,T[k*2+1].num);
}
int Query(int k,int L,int R)
{
Down(k);
if(T[k].l==L&&T[k].r==R)
return T[k].num;
int mid=(T[k].l+T[k].r)>>1;
int re=2000000000;
if(L<=mid&&R>mid)
{
re=min(re,Query(k*2,L,mid));
re=min(re,Query(k*2+1,mid+1,R));
}
else
if(L>mid)
re=Query(k*2+1,L,R);
else
if(R<=mid)
re=Query(k*2,L,R);
Down(k*2);
Down(k*2+1);
T[k].num=min(T[k*2].num,T[k*2+1].num);
return re;
}
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int main()
{
K=read();N=read();C=read();
for(int i=1;i<=K;++i)
G[i]=(Group){read(),read(),read()};
sort(&G[1],&G[K+1]);
Build(1,1,N);
int ans=0;
for(int i=1;i<=K;++i)
{
int Up=min(G[i].num,Query(1,G[i].a,G[i].b));
ans+=Up;
Update(1,G[i].a,G[i].b-1,-Up);
}
cout<<ans<<endl;
return 0;
}
【洛谷1607】【USACO09FEB】庙会班车的更多相关文章
- 洛谷 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 ...
- 【贪心】洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle 题解
不是很容易写出正解的贪心问题. 题目描述 Although Farmer John has no problems walking around the fair to collect pri ...
- [USACO09FEB]庙会班车Fair Shuttle
题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车 ...
- 线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle
Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛 ...
- 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 ...
- 洛谷 P2939 [USACO09FEB]改造路Revamping Trails 题解
P2939 [USACO09FEB]改造路Revamping Trails 题目描述 Farmer John dutifully checks on the cows every day. He tr ...
- 洛谷P2939 [USACO09FEB]改造路Revamping Trails
题意翻译 约翰一共有\(N\))个牧场.由\(M\)条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场\(1\)出发到牧场\(N\)去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰 ...
随机推荐
- java递归
package com.sun.test; import java.util.ArrayList; import java.util.List; /** * 递归 * */ public class ...
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...
- 页面刷新方式实时检测cookie是否失效
在浏览器端每隔10秒钟刷新一次页面,可用于检查cookie值是否失效. 在study.php文件中存在这样一条语句: <meta http-equiv="refresh" c ...
- 解决`向github提交代码是老要输入用户名密码`
在命令行输入命令:git config --global credential.helper store☞ 这一步会在用户目录下的.gitconfig文件最后添加: [credential] help ...
- WordPress 实现附件上传自动重命名但不改变附件标题
WordPress 上传媒体文件时,默认会保持文件名不变.如果上传文件名中包含中文字符,则会造成部分浏览器显示的文件 URL 疑似乱码甚至无法访问.网上流行较广的是通过注册 wp_handle_up ...
- Python基础——字符串
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 在Python中,字符串也是一种数据类型.相比其它数据类型,字符串算是比较复杂的.为何呢?因为字符串不仅包含英文字母 ...
- 又是一个愚蠢的错误,皆因.xml而起
论java中的.xml到底有多坑?! 感觉自己都快哭了,再一次被.xml给坑了一下,这次坑的太狠了,一下子导致自己浪费了昨天一下午,一晚上,今天一上午和半个下午呀,中间的过程真的是乏善可陈呀,各 ...
- JavaScript将小写金额转换成大写
//num为小写金额,单位元 changeMoney(num) { if(isNaN(num))return ""; var strPrefix=""; if( ...
- linux清屏命令(clear,reset)
(1)clear 这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息.一般都会用这个命令. (2)reset 这个命令将完全刷新终端屏幕,之前的终端输入 ...
- python2.x和python3.x的区别
一.python2.x和python3.x中raw_input( )和input( )区别 1.在Python2.x中raw_input( )和input( ),两个函数都存在,其中区别为 raw_i ...