传送门


将乘客按照\(D_i\)从小到大排序并重新标号。对于服务站\(j\),如果\(S_j \mod T \in (D_i , D_{i+1})\),那么可以少接一些水,在保证司机有水喝的情况下让编号在\([x,i](x \in [1,i])\)的乘客下车(我们将这个区间称作这个服务区的下车区间),然后到达这个服务站接水。区间\([D_x , D_i]\)之间有服务区也没关系,只要在服务区不接水就可以了。

所以有DP:设\(f_i\)表示考虑了前\(i\)个乘客,最少花费的费用是多少。转移有:①\(f_i = f_{i-1} + \lfloor \frac{X - D_i}{T} \rfloor \times W\),表示第\(i\)个人一直坐到终点;②如果在\((D_i , D_{i+1})\)内有服务站,还有转移\(f_i = \min\limits_{0 \leq j < i} f_j + (i - j) \times W \times cnt + \sum\limits_{k = j + 1}^i C_k\),其中\(cnt\)表示的是\(j+1\)到\(i\)的乘客的最少饮水次数,也就是\(\min\limits_{S_k \mod T \in (D_i , D_{i+1})}\lfloor \frac{S_k}{T} \rfloor\)

对于一些乘客,如果我们已经确定了他们要下车,那么一定是越早下车越好,也就是说所有服务站的下车区间一定无交,所以上面②的转移是正确的。

把\(\sum\limits_{k = j + 1}^i C_k\)变成前缀和,就是一个可以斜率优化的式子,栈维护凸包即可。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define INF 1e18
//This code is written by Itst
using namespace std; #define int long long
inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define PII pair < int , int >
#define st first
#define nd second
const int MAXN = 2e5 + 3;
int N , M , X , W , T , top = 1;
int dp[MAXN] , dis[MAXN] , stk[MAXN];
struct machine{
int D , C;
bool operator <(const machine a)const{return D < a.D;}
}now[MAXN]; long double calc(PII A , PII B){
return 1.0 * (A.nd - B.nd) / (B.st - A.st);
} PII create(int x){return PII(-x * W , dp[x] - now[x].C);} bool chk(int a , int b , int c){
PII A = create(a) , B = create(b) , C = create(c);
return calc(A , B) > calc(A , C);
} int calc(PII a , int x){return a.st * x + a.nd;} int get(int X){
int L = 1 , R = top;
while(L < R){
int mid = (L + R) >> 1;
calc(create(stk[mid]) , X) > calc(create(stk[mid + 1]) , X) ? L = mid + 1 : R = mid;
}
return calc(create(stk[L]) , X);
} bool cmp(int a , int b){return a % T < b % T;} signed main(){
#ifndef ONLINE_JUDGE
freopen("eternity.in","r",stdin);
freopen("eternity.out","w",stdout);
#endif
X = read(); N = read(); M = read(); W = read(); T = read();
for(int i = 1 ; i <= N ; ++i)
dis[i] = read();
dis[++N] = X;
for(int i = 1 ; i <= M ; ++i){
now[i].D = read();
now[i].C = read();
}
sort(dis + 1 , dis + N + 1 , cmp);
sort(now + 1 , now + M + 1);
now[M + 1].D = T;
for(int i = 1 ; i <= M ; ++i)
now[i].C = now[i].C + now[i - 1].C;
memset(dp , 0x3f , sizeof(dp));
dp[0] = 0; int pos = 1;
while(pos <= N && dis[pos] % T <= now[1].D) ++pos;
for(int i = 1 ; i <= M ; ++i){
int Min = INF;
while(pos <= N && dis[pos] % T < now[i + 1].D)
Min = min(Min , dis[pos++] / T);
dp[i] = dp[i - 1] + ((X - now[i].D) / T + 1) * W;
if(Min != INF)
dp[i] = min(dp[i] , get(Min) + Min * W * i + now[i].C);
while(top > 1 && chk(stk[top - 1] , stk[top] , i))
--top;
stk[++top] = i;
}
cout << dp[M] + (X / T + 1) * W;
return 0;
}

LOJ2396 JOISC2017 长途巴士 斜率优化的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  2. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  3. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  4. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  5. 【BZOJ2442】 [Usaco2011 Open]修剪草坪 斜率优化DP

    第一次斜率优化. 大致有两种思路: 1.f[i]表示第i个不选的最优情况(最小损失和)f[i]=f[j]+e[i] 显然n^2会T,但是可以发现f的移动情况可以用之前单调队列优化,就优化成O(n)的了 ...

  6. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  7. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  8. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  9. [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)

    Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...

随机推荐

  1. SpringBoot整合系列-PageHelper分页插件

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9971043.html SpringBoot整合MyBatis分页插件PageHelper ...

  2. SpringMVC集成rabbitmq:优化秒杀下单环节

    前言 上一篇在springboot中基于自动配置集成了rabbitmq.那么回到最初的话题中就是想在秒杀下单环节增加排队机制,从而达到限流的目的. 优化秒杀下单流程 之前是在控制器里拿到客户端请求后直 ...

  3. [Go] golang结构体成员与函数类型

    package main import ( "fmt" ) //定义一个类型 type tsh struct { //定义成员,类型是func() string test func ...

  4. 2013年第四届蓝桥杯javaB组 试题 答案 解析

    1.世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都 ...

  5. 【大数据】了解Hadoop框架的基础知识

    介绍 此Refcard提供了Apache Hadoop,这是最流行的软件框架,可使用简单的高级编程模型实现大型数据集的分布式存储和处理.我们将介绍Hadoop最重要的概念,描述其架构,指导您如何开始使 ...

  6. Android为TV端助力listview 非常重要的几个属性

    首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false Android:stackFromBottom="true" ...

  7. redis 五大数据结构__常用命令

    linux 下下载redis数据库 apt install redis 如果提示权限不够的话, 直接提权: sudo apt install redis-server linux启用.停止服务 ser ...

  8. dotNet core 应用部署至 centos(超详解附截图)

    文章来源:公众号-智能化IT系统. 需要安装的插件以及支撑架构 1.dotnetSDK dotnet 相关命令是属于 .NET Core command-line (CLI) 的一部分,Microso ...

  9. Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式

    Python第三天 序列  5种数据类型  数值  字符串  列表  元组  字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell ...

  10. sqlmap 基本应用

    sqlmap 基本应用: sqlmap详细命令: -is-dba 当前用户权限(是否为root权限) -dbs 所有数据库 -current-db 网站当前数据库 -users 所有数据库用户 -cu ...