[POI2014]Freight
题目大意:
有两个城镇$A$和$B$,有$n(n\le10^6)$辆车从$A$地出发前往$B$再返回$A$地。两地之间的行驶时间为$s(s\le10^9)$,每辆车从$A$地出发的最早时间是$t_i(0\le t_1\le t_2\le\ldots\le t_n\le10^9)$。行驶过程中需要保证每辆车出发时间至少相差$1$,且每个时刻运行的车都是同一个方向,问所有车都返回$A$地至少需要多少时间?
思路:
“行驶过程中需要保证每辆车出发时间至少相差$1$”相当于令$t_i=\max(t_i,t_{i-1}+1)$。
“每个时刻运行的车都是同一个方向”说明我们只需要对这些车分批,一批往返结束后下一批开始往返(一批车留在$B$地,另一批从$A$地过来一定存在一种等价的方案使得第一批往返完成后第二批出发)。
有了以上两个信息,不难得到状态转移方程$f_i=\min\{\max(t_i,f_j+i-j-1)+2s+i-j-1\}$。
由于$f_j+i-j-1$是单调递增的,所以$\max(t_i,f_j+i-j-1)$中一定可以找到一个转折点$j$使得$j$的左边取到$t_i-i$,右边取到$f_j-j-1$。左边是定值因此$j$越大越好,右边相当于求区间$[j,i)$的最小值,用树状数组维护即可,时间复杂度$O(n\log n)$。已经能AC了。
事实上,因为$f_i$的增长速度$\ge2i$,所以取最左边即转折点的一定更优,这样就可以省掉树状数组。考虑到转折点位置是单调递增的,因此只需要每次把上一次的转折点位置记录下来,累加到当前转折点即可。时间复杂度$O(n)$。
#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e6+;
int t[N]={-};
int64 f[N];
int main() {
const int n=getint(),s=getint();
for(register int i=,j=;i<=n;i++) {
f[i]=LLONG_MAX;
t[i]=std::max(getint(),t[i-]+);
for(j--;j<i&&std::max((int64)t[i],f[j]+i-j-)+s*+i-j-<f[i];j++) {
f[i]=std::max((int64)t[i],f[j]+i-j-)+s*+i-j-;
}
}
printf("%lld\n",f[n]);
return ;
}
[POI2014]Freight的更多相关文章
- BZOJ3830 : [Poi2014]Freight
首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...
- bzoj 3830: [Poi2014]Freight【dp】
参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走 ...
- POI2014题解
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
- Work at DP
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- Simulating a Freight robot in Gazebo
Installation Before installing the simulation environment, make sure your desktop is setup with a st ...
随机推荐
- corosync.conf
##totem定义集群内各节点间是如何通信的,totem本是一种协议,专用于corosync专用于各节点间的协议,协议是有版本的 totem { ##版本号 version: ##安全认证on|off ...
- ROS 常用
可以通过以下命令查看环境变量: export | grep ROS 安装 sudo apt-get install XXX 卸载 dpkg --list //Debian package sudo a ...
- 【多线程学习(1)】创建java多线程
1)java多线程的创建方式有三种: 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口 第一种: //继承Thread类 class ExtendsThread ex ...
- 使用awk根据多维度统计系统tps
业务简单日志格式: [2017-08-28 01:00:00.523]transfer_search,7001045,1708271100083774377,20170827,,,,,,,,,,001 ...
- 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流
题目描述 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个 ...
- zoj 1508 Intervals (差分约束)
Intervals Time Limit: 10 Seconds Memory Limit: 32768 KB You are given n closed, integer interva ...
- Ubuntu扩展系统盘容量,虚拟机下
安装gparted软件 sudo apt-get install gparted 接下来, 我们开始用Gparted软件扩展Ubuntu目录的容量: 先看操作步骤: 1. 先从windows的 ntf ...
- Codeforces Round #356 (Div. 2) C
C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Educational Codeforces Round 42 (Rated for Div. 2) B
B. Students in Railway Carriage time limit per test 2 seconds memory limit per test 256 megabytes in ...
- 享元模式(FlyWeight Pattern)及其在java自动拆箱、自动装箱中的运用
本文主要从三个方面着手,第一:简要介绍享元模式.第二:享元模式在基本类型封装类中的运用以Integer为例进行阐述.第三:根据第一.第二的介绍,进而推出java是如何实现自动拆箱与装箱的. 第一:简要 ...