当前位置: 首页 > news >正文

【洛谷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;
}

转载于:https://www.cnblogs.com/cjyyb/p/7197236.html

相关文章:

  • 搭建wordpress-安装xshell
  • python基础2
  • POJ 1830 开关问题(高斯消元求解的情况)
  • Python3的一些基本输入输出
  • 公有属性 公有方法(原型方法) 私有属性 私有方法 特权方法 静态属性 静态方法 对象字面量创建...
  • angularJS指令
  • 头文件assert.h
  • 后台运行命令:amp;和nohup command amp; 以及关闭、查看后台任务
  • 进程间通信之-信号signal--linux内核剖析(九)
  • 入门之快速排序
  • 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
  • Vue框架 周期
  • 转 JavaScript 检查(Linting)工具的比较
  • 前端知识学习——html
  • oracle中length、lengthb、substr、substrb用法小结
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译]Python中的类属性与实例属性的区别
  • Apache的80端口被占用以及访问时报错403
  • canvas绘制圆角头像
  • CSS 专业技巧
  • Docker 笔记(2):Dockerfile
  • HomeBrew常规使用教程
  • LintCode 31. partitionArray 数组划分
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 微信支付JSAPI,实测!终极方案
  • 写给高年级小学生看的《Bash 指南》
  • 一天一个设计模式之JS实现——适配器模式
  • 仓管云——企业云erp功能有哪些?
  • # Java NIO(一)FileChannel
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #1014 : Trie树
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (07)Hive——窗口函数详解
  • (12)Hive调优——count distinct去重优化
  • (4)Elastix图像配准:3D图像
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (算法)求1到1亿间的质数或素数
  • (转)负载均衡,回话保持,cookie
  • (转载)利用webkit抓取动态网页和链接
  • (转载)虚函数剖析
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET开源快速、强大、免费的电子表格组件
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • :如何用SQL脚本保存存储过程返回的结果集
  • @PreAuthorize注解
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C++打怪升级]--学习总目录
  • [codeforces] 25E Test || hash