题面

题目描述

逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠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】庙会班车的更多相关文章

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

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

  2. 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle

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

  3. 【贪心】洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle 题解

        不是很容易写出正解的贪心问题. 题目描述 Although Farmer John has no problems walking around the fair to collect pri ...

  4. [USACO09FEB]庙会班车Fair Shuttle

    题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车 ...

  5. 线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle

    Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛 ...

  6. P1607 [USACO09FEB]庙会班车Fair Shuttle

    题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...

  7. [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx&&贪心

    题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...

  8. 洛谷 P2939 [USACO09FEB]改造路Revamping Trails 题解

    P2939 [USACO09FEB]改造路Revamping Trails 题目描述 Farmer John dutifully checks on the cows every day. He tr ...

  9. 洛谷P2939 [USACO09FEB]改造路Revamping Trails

    题意翻译 约翰一共有\(N\))个牧场.由\(M\)条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场\(1\)出发到牧场\(N\)去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰 ...

随机推荐

  1. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...

  2. CentOS6.9安装mysql5.7

    1.查看系统版本 uname -a 2.卸载old mysql rpm -qa|grep -i mysql rpm -ev MySQL-client-5.5.25a-1.rhel5 如果提示依赖错误, ...

  3. WPF&Winform版本地图引擎

    最近几年一直从事地图方面的工作,自主研发了WPF和Winform两个版本瓦片地图引擎.轻量级.不依赖第三库.先上一张图片展示一下吧! 产品包括服务端和客户端两部份: 1.服务端主要地图图层配制和空间计 ...

  4. qemu-trustzone编译&运行(包含linux内核的编译方法)

    由于之前都是用的mtk6797开发板,回到实验室之后想要做实验的话需要弄一个支持trustzone的qemu,在这里记录一下我的编译和调试过程.本来最近一直忙着看论文和写论文,但是忽然发现自己在实验部 ...

  5. 老男孩Python全栈开发(92天全)视频教程 自学笔记09

    day9课程内容: 乌班图(ubuntu)64位系统 和 VMware 虚拟机安装(官网收费又麻烦,在网上找资源 安装vmware: vm运行(秘钥找度娘)--文件--新建虚拟机--自定义 下一步-- ...

  6. SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序

    项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...

  7. java网络编程(3)——UDP

    UDP在java中主要使用DatagramSocket来实现通讯,数据一般是通过DatagramPacket来封装: 发送方只需指定接受方的地址和端口,然后通过send()方法就可以把封装在Datag ...

  8. [Note] 计算机网络的应用层

    应用层 原理 结构和模型 客户-服务器体系结构(client-server architecture ) 通信不是直接的,需要通过服务器转发 经常会在服务器积压大量的负载 服务器(server) 服务 ...

  9. webTest-----webUI自动化框架

    webTest框架介绍 地址 https://github.com/wuranxu/webTest 希望大家能够喜欢!!! 简介 本框架基于Python3+selenium3+unittest组成,用 ...

  10. linux中的三个文件时间

    Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time). 后来为了解决atime的性能问题, ...