$Noip2011/Luogu1315$ 观光公交 贪心
$Sol$
觉得这题贪心要想很多事情,不适合我这种没脑子选手$ovo$.看题解还理解了很久.
最开始是这样想的:把所有的路段上的乘客按大小排个序用加速器就好了,这个想法被自己轻松$hack.$因为,假如一个路段的终点没人下车而且又要等乘客很久才能出发,那前面用加速器也没意义了.由这个反例似乎可以推出用$1$个加速器能减少的时间?由这个起点向后枚举点,看用了加速器到达后是否还需要等乘客,如果不是,那么这个加速器对于这站下车的乘客就是有帮助的.由此也可以看出用加速器之后可能会对后面的出发时间有影响,这里需要一个变量来维护.
具体来说:
$off[i]$表示第$i$站下车的乘客数量.
$arr[i]$表示第$i$站乘车的乘客的最晚到达时间.
$dd[i]$表示汽车到达$i$站的时间.
$d[i]$表示第$i$站到第$i+1$站所需要的时间.
$dd[i]=max(dd[i-1],arr[i-1])+d[i-1].$
$aff[i]$表示假设$(i,i+1)$这段路程所需时间减少$1$,那么在$aff[i]$下站的人是最后的受益者.
差不多就是维护上面的变量就好了,具体看代码叭.
$Code$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define int long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,m,k,as,off[N],arr[N],dd[N],sum[N],d[N],aff[N];
struct node{int t,u,v;}a[N*];
main()
{
n=read(),m=read(),k=read();
go(i,,n-)d[i]=read();
go(i,,m)
{
a[i]=(node){read(),read(),read()};
off[a[i].v]++;
arr[a[i].u]=max(arr[a[i].u],a[i].t);
}
go(i,,n)dd[i]=max(dd[i-],arr[i-])+d[i-];
go(i,,n)sum[i]=sum[i-]+off[i];
go(i,,m)as+=dd[a[i].v]-a[i].t;
arr[n]=inf;
while(k--)
{
int maxs=,qwq=;
yes(i,n-,)
if(dd[i+]>arr[i+])aff[i]=aff[i+];
else aff[i]=i+;
go(i,,n-)
if(sum[aff[i]]-sum[i]>maxs&&d[i])
maxs=sum[aff[i]]-sum[i],qwq=i;
as-=maxs;d[qwq]-=;
go(i,,n)dd[i]=max(dd[i-],arr[i-])+d[i-];
}
printf("%lld\n",as);
return ;
}
随机推荐
- 蓝牙(3)蓝牙UUID与SDP
1.服务发现协议 (SDP) SDP = Service Discovery Protocol 主要用来根据已分配编号(UUID)搜索服务.浏览群组列表.文档 URL 和图标 URL等. 详细见: ...
- CH1401 兔子与兔子
#include<bits/stdc++.h> using namespace std; ,p=; typedef unsigned long long ULL;//自然溢出 ULL f[ ...
- Python基础:23异常
一:概述 1:错误 错误有语法和逻辑上的区别.语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译.这些错误必须在程序执行前纠正.逻辑错误可能是由于不完整或是不合法的输入所致,还可能是 ...
- P2993 [FJOI2014]最短路径树问题 点分治+最短路
这道题还是非常简单的,由于我们要保证最小字典序,因此我们需要把边进行排序,然后从大到小插入,因为链式前向星是倒着存的.我们只需要先跑一个最短路,然后查询边是不是在最短路上,这个可以通过枚举边并用 di ...
- Python基础:28正则表达式
一:概述 正则表达式(RE)为高级文本模式匹配,以及搜索-替代等功能提供了基础.正则表达式(RE)是一些由字符和特殊符号组成的字符串,它们能匹配多个字符串.Python通过标准库的re模块支持正则表达 ...
- Laravel 5.3 用户验证源码探究 (一) 路由与注册
https://blog.csdn.net/realghost/article/details/52558962 简介 Laravel 从 5.2 开始就有了开箱即用的用户验证,5.3 又在 5.2 ...
- Ubuntu 18.04LTS安装配置Java OpenJDK8
安装OpenJDK8 sudo apt-get install openjdk-8-jdk 配置Java环境变量 sudo vim /etc/profile 在profile末尾添加以下内容: exp ...
- set_time_limit(0)是什么意思?
语法 : void set_time_limit (int seconds) 说明 : 设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误.它预设的限制时间是30秒,max_execu ...
- Codeforces Round #200 (Div. 1 + Div. 2)
A. Magnets 模拟. B. Simple Molecules 设12.13.23边的条数,列出三个等式,解即可. C. Rational Resistance 题目每次扩展的电阻之一是1Ω的, ...
- 2019-10-10-优雅调试-REST-API-的工具
title author date CreateTime categories 优雅调试 REST API 的工具 lindexi 2019-10-10 20:9:33 +0800 2019-10-1 ...